Java 为什么Swing不发布对原始X服务器的关注

Java 为什么Swing不发布对原始X服务器的关注,java,swing,focus,x11,Java,Swing,Focus,X11,我注意到swing应用程序的行为有所不同。我使用Centos 6.5,只启动raw X服务器,没有窗口管理器。在此场景中,键盘焦点取决于指针位置。若指针在窗口上,则该窗口具有键盘焦点。我在xterm、gnomer终端、gedit和firefox上测试了它 我开发了非常简单的swing应用程序: JFrame jFrame = new JFrame("JFrame tittle"); JPanel p = new JPanel();

我注意到swing应用程序的行为有所不同。我使用Centos 6.5,只启动raw X服务器,没有窗口管理器。在此场景中,键盘焦点取决于指针位置。若指针在窗口上,则该窗口具有键盘焦点。我在xterm、gnomer终端、gedit和firefox上测试了它

我开发了非常简单的swing应用程序:

                JFrame jFrame = new JFrame("JFrame tittle");
                JPanel p = new JPanel();

                JTextField textField = new JTextField("111111111111111");

                p.add(textField);
                jFrame.setContentPane(p);
                jFrame.pack();
                jFrame.setVisible(true);
如果我运行这个应用程序,那么JTextField具有焦点,并且我不能将焦点更改为另一个窗口。当我在gnome终端上移动指针时,JTextField仍然有键盘焦点,我只能在上面使用键盘。我可以使用指针在gnome终端中打开菜单,菜单有键盘焦点,然后我可以使用菜单上的箭头,但当我关闭菜单时,焦点返回到JTextField

总之,我不能使用任何其他应用程序。为什么?swing应用程序与其他应用程序有什么不同?当我在另一个窗口上移动指针时,为什么swing不释放焦点?编辑:我当然也点击了另一个窗口

如果我启动窗口管理器metacity,它就会正常工作

======编辑==== 图1显示了两个窗口:xterm和gnome终端。当我在gnome终端上移动光标时,我可以使用键盘在gnome终端中写入,当我在xterm上移动光标时,键盘将写入xterm。

当我启动java swing应用程序时,它出现在左上角。只能写入JTextField,光标不影响键盘焦点,如下图所示:

我在swing应用程序中添加了外观名称和描述的打印,以便在控制台中打印。这无关紧要。

======编辑=====

我找到了以下quote int教程:

与公民不同,窗口管理器有权限,但没有权限 责任。项目必须准备好与任何类型的项目合作 属于窗口管理器或完全没有[…]。-Xlib编程手册 §1.2.3


所以我认为Swing应用程序应该准备好在没有WM的情况下工作

正如我在评论中所写,不使用WindowManager时可能会出现问题

见:

在所有平台上,没有万无一失的方法来确保 窗口获得焦点。在某些操作系统上,如Microsoft 窗口,前窗口通常成为聚焦窗口。在这些 在这种情况下,Window.toFront方法将窗口向前移动, 从而使它成为焦点。但是,在其他操作系统上,例如 作为Solaris™ 在操作系统中,窗口管理器可以选择 基于光标位置的聚焦窗口,在这些情况下 Window.toFront方法的行为不同


从这里开始:

我很难理解你的问题。你会截图吗?首先,你说你不使用WindowManager,然后你说你不能点击另一个窗口。据我所知,窗口管理器可以根据光标位置选择聚焦窗口。请看这里:这是Swing中的一个bug,他们似乎将其称为特性。请参阅例如或。@n.m:记住,Mariusz没有使用任何WindowManager。这意味着,你发布的链接与他的问题无关。@Ben Swing使用不受支持的窗口管理器打破了焦点,这意味着它基本上是垃圾,其作者没有任何线索。为什么在没有窗口管理器的情况下运行它会很好?@n.m:我不想说没有窗口管理器它会工作。我只是想知道,如果不使用任何窗口管理器,这种行为是否真的是错误的。我不擅长Xorg,但我认为X服务器可以在没有窗口管理器的情况下管理焦点。键盘焦点取决于光标位置。但swing是个例外。Swing有焦点,Swing不会释放它。我还问swing与她的应用程序有什么不同。