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

时间:2010-05-12 14:58:44

标签: java linux keyboard focus window-managers

我们希望用Java快速构建小部件原型。我们将它们叠加在用专有第三方图形包编写的显示器上。我们发现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。当然,有太多的经理人,我不知道该集中精力。同样,很多人似乎都缺乏通过app指定焦点(大多数似乎只关心广泛的政策)。

1 个答案:

答案 0 :(得分:5)

最后,原型在JWindow而不是JFrame中重新编写,当JWindow调用了setFocusableWindowState(false)时,Java确实将焦点放回原点......问题解决了。