我注意到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。
当我启动我的java swing应用程序时,它出现在左上角。我只能写入JTextField,光标不会影响键盘焦点。以下图片显示:
我在外观应用程序中添加了外观名称和描述的打印,因此它在控制台中打印。这是无关紧要的。
===== EDIT =====
我发现以下引用int this教程:
与公民不同,窗口管理员有权利,但没有权利 责任。计划必须准备好与任何类型合作 窗口管理员或根本没有[...]。 - Xlib编程手册 §1.2.3
所以我认为Swing应用程序应该准备好在没有WM的情况下工作。
答案 0 :(得分:0)
正如我在评论中写的那样,当不使用一个WindowManager时可能会出现问题。
见:
在所有平台上都没有万无一失的方法来确保a 窗口获得焦点。在某些操作系统上,例如Microsoft Windows,前窗通常成为焦点窗口。在这些 例如,Window.toFront方法将窗口移到前面, 从而使它成为焦点。但是,在其他操作系统上,例如 作为Solaris™操作系统,窗口管理器可以选择 基于光标位置的聚焦窗口,在这些情况下 Window.toFront方法的行为是不同的。
从这里开始:http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html