java - 如何停止/解决 Java 应用程序在 Linux 窗口管理器中窃取焦点

标签 java linux keyboard focus window-managers

我们想用 Java 快速制作小部件原型(prototype)。我们将它们覆盖在用专有的第 3 方图形包编写的显示之上。我们发现 Java GUI 从窗口管理器中窃取了键盘焦点。

窗口管理器是 fvwm,我已经尝试对其进行配置,以便将 Java 应用程序设置为不获得焦点,此外,如果它确实获得焦点,则将其移走并将其提供给其他 GUI。

如果我用 Java 应用程序运行它,它就不起作用(只要鼠标悬停在 Java GUI 上,它就会有键盘焦点)- 如果我用一些标准的 X GUI 小部件 (XEyes) 代替 Java GUI,它就可以工作就像一个魅力。这为 Java 不遵守 ICCCM 的说法(由 fvwm 的人员维护)提供了一些证据。

我想知道其他人是否已经解决了这个问题,如果是的话是如何解决的。到目前为止,对于如何尝试和解决这个问题,我有几个选择:

1) 旋转 Java 设置,希望如果我在那里关闭焦点,它可能会将焦点控制交还给窗口管理器(到目前为止,我已经在父 JFrame 上尝试过“setFocusable(false)”。这没有工作。线程“http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/awt.html#gdaao”表示我应该改为执行“Window.setFocusableWindowState(false)” 有问题的 GUI 尚未在 Window 中重做,但我也不完全相信 Java 会放弃焦点

2) 使用 JNI 在 Java 程序中进行低级 X 调用。我认为这可能会起作用,但是,我从来没有玩过低级别的 X。我不确定我应该使用什么调用(调用 XtSetKeyboardFocus() 应该是危险的......)或者我如何识别我正在操作的 GUI(在这方面 fvwm 很好,因为他们有一个 GUI,允许您单击另一个 GUI 并找出它的“名称”和“类”)

3) 使用“更强大”的窗口管理器。一些不使用 ICCCM 的窗口管理器可能能够更好地处理 Java。当然,经理多如牛毛,不知道该专注于什么。同样,许多人似乎没有按应用指定焦点(大多数人似乎只关心广泛的政策)。

最佳答案

最后,原型(prototype)在 JWindow 而不是 JFrame 中重新设计,当 JWindow 调用 setFocusableWindowState(false) 时,Java 确实交还了焦点……问题解决了。

关于java - 如何停止/解决 Java 应用程序在 Linux 窗口管理器中窃取焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2820014/

相关文章:

java - Java中使用边界查找多个子字符串

java - JPA/Hibernate - 使用唯一约束作为主键

java - Tomcat 7 和 CentOS 7 中的远程调试

linux - Linux 上的 NPAPI 和 Google Chrome

c - fallocate() 做什么?

java - Netbeans Derby 连接上的 TableView 不存在异常

linux - 在 linux 启动时启动脚本

ios - 禁用 iOS5 键盘中的拆分选项

ios - 以编程方式将键盘从大写切换为小写

python - 无法在Python中使用 'Keyboard'库模拟ctrl+shift+left