【问题标题】:Why Swing does not release focus on raw X Server为什么 Swing 不释放对原始 X 服务器的关注
【发布时间】: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
  • 这是 Swing 中的一个错误(他们似乎将其称为“功能”)。参见例如herehere.
  • @n.m:请记住,Mariusz 没有使用 any WindowManager。也就是说,你发布的链接与他的问题无关。
  • @Ben Swing 用“不受支持的”窗口管理器打破焦点(这意味着它基本上是废话,它的作者不知道)。为什么在完全没有窗口管理器的情况下运行它会很好玩?
  • @n.m:我不想说 没有 windowmanager 它应该可以工作。我只是想知道,当不使用任何窗口管理器时,行为是否真的错误

标签: java swing focus x11


【解决方案1】:

正如我在 cmets 中所写的,当不使用 WindowManager 时可能会出现问题。

见:

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

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

【讨论】:

  • 我不是 Xorg 专家,但我认为 X 服务器可以在没有窗口管理器的情况下管理焦点。键盘焦点取决于光标位置。但摇摆是个例外。 Swing 有焦点,但 Swing 不释放它。我还问swing有什么不同的应用形式。
猜你喜欢
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2021-12-09
  • 1970-01-01
  • 2012-12-26
  • 2012-02-12
  • 2016-04-24
相关资源
最近更新 更多