【发布时间】:2014-09-08 11:33:31
【问题描述】:
我注意到 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),它就会正常工作。
=====编辑==== 图 1 显示了两个窗口:xterm 和 gnome-terminal。当我在 gnome-terminal 上移动光标时,我可以使用键盘在 gnome-terminal 中写入,当我在 xterm 上移动光标时,键盘会写入 xterm。
当我启动我的 java swing 应用程序时,它出现在左上角。我只能写入 JTextField 并且光标不会影响键盘焦点。下图显示它:
我在 Swing 应用程序中添加了外观名称和描述的打印,因此它可以在控制台中打印。这是无关紧要的。
=====编辑=====
我发现以下引用 int this 教程:
与公民不同,窗口管理器有权限但没有 责任。程序必须准备好与任何类型的合作 窗口管理器或根本没有 [...]。 — Xlib 编程手册 §1.2.3
所以我认为 Swing 应用程序应该准备好在没有 WM 的情况下工作。
【问题讨论】:
-
我很难理解您的问题。你能做截图吗?首先,你说你不使用 WindowManager,然后你说你不能点击另一个窗口。据我所知,窗口管理器可以根据光标位置选择焦点窗口。看这里:docs.oracle.com/javase/tutorial/uiswing/misc/focus.html
-
@n.m:请记住,Mariusz 没有使用 any WindowManager。也就是说,你发布的链接与他的问题无关。
-
@Ben Swing 用“不受支持的”窗口管理器打破焦点(这意味着它基本上是废话,它的作者不知道)。为什么在完全没有窗口管理器的情况下运行它会很好玩?
-
@n.m:我不想说 没有 windowmanager 它应该可以工作。我只是想知道,当不使用任何窗口管理器时,行为是否真的错误。