我们想要在Java中快速构build小部件。 我们将它们覆盖在用专有第三方graphics软件包编写的显示屏上。 我们发现Java GUI从窗口pipe理器中窃取键盘焦点。
窗口pipe理器是fvwm,我已经尝试过configuration它,所以Java应用程序设置为不让焦点,而且如果它有焦点把它拿走并把它给另一个GUI。
如果我用Java应用程序运行它,它不起作用(只要鼠标在Java GUI上,它有键盘焦点) – 如果我交换一些标准的X GUI小部件(XEyes)来代替Java GUI,它就像一个魅力。 这使得Java不尊重ICCCM的说法(由fvwm的人维护)有所缓解。
我想知道如果其他人已经解决了这个问题,如果是的话如何。 到目前为止,我有几个select如何尝试和解决这个问题:
1)twiddle Java设置,希望如果我关掉焦点,也许它会把焦点控制交给窗口pipe理器(到目前为止,我已经尝试过“setFocusable(false)”在父JFrame上,这是行不通的。线程“ http://java.sun.com/javase/6/webnotes/trouble/TSG-Desktop/html/awt.html#gdaao ”表示我应该改为“Window.setFocusableWindowState(false)”有问题的GUI hasn但是我还没有完全相信Java会重新关注焦点
2)使用JNI在Java程序中进行低级别的X调用。 我认为这可能会工作,但是,我从来没有玩过低水平的X.我不确定我应该使用什么样的调用(XtSetKeyboardFocus()应该是危险的)或者我怎样才能识别我操作的graphics用户界面(在这方面fvwm是很好的,因为他们有一个graphics用户界面,让你点击另一个graphics用户界面,找出它的“名称”和“类”)
3)使用“更强”的窗口pipe理器。 一些不使用ICCCM的窗口pipe理器可能会更好地处理Java。 当然,有很多pipe理者,我不知道该集中注意力。 同样地,很多人似乎都没有明确指出应用程序的重点(大多数人似乎只关心广泛的政策)。
最后,原型在JWindow而不是JFrame中被重写,当JWindow调用setFocusableWindowState(false)时,Java返回焦点…问题得以解决。