为什么Swing不会将注意力放在原始X服务器上

时间:2014-09-08 11:33:31

标签: java swing focus x11

我注意到swing应用程序的行为有所不同。我使用Centos 6.5,我只启动没有窗口管理器的原始X服务器。在这个场景中,键盘焦点取决于指针的位置。如果指针在窗口上,则窗口具有键盘焦点。我在xterm,gnomer-terminal,gedit,firefox上测试过它。

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

                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-terminal JTextField上移动指针时仍然有键盘焦点,我只能在它上面使用键盘。我可以使用指针打开gnome-terminal菜单,然后菜单有键盘焦点(我可以使用菜单上的箭头)但是当我关闭菜单时,焦点会返回到JTextField。

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

如果我启动窗口管理器(metacity),那么它可以正常工作。

===== EDIT ==== 图1显示了两个窗口:xterm和gnome-terminal。当我在gnome-terminal上移动光标时,我可以使用键盘在gnome-terminal中写入,当我在xterm上移动光标然后键盘写入xterm。 Picture 1

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

enter image description here

我在外观应用程序中添加了外观名称和描述的打印,因此它在控制台中打印。这是无关紧要的。 enter image description here

===== EDIT =====

我发现以下引用int this教程:

  

与公民不同,窗口管理员有权利,但没有权利   责任。计划必须准备好与任何类型合作   窗口管理员或根本没有[...]。 - Xlib编程手册   §1.2.3

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

1 个答案:

答案 0 :(得分:0)

正如我在评论中写的那样,当不使用一个WindowManager时可能会出现问题。

见:

  

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

从这里开始:http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html