如何停止/解决Java应用程序窃取Linux窗口管理器的焦点
我们想要在Java中快速构建小部件的原型。 我们将它们覆盖在用专有第三方图形软件包编写的显示屏上。 我们发现Java GUI从窗口管理器中窃取键盘焦点。
窗口管理器是fvwm,我已经尝试过配置它,所以Java应用程序设置为不关注焦点,此外,如果焦点将其取出并将其提供给其他GUI。
如果我使用Java应用程序运行它,它不起作用(每当鼠标移到Java GUI上时它都有键盘焦点) - 如果我将一些标准X GUI小部件(XEyes)替换为Java GUI,它就像一个魅力。 这使得Java不尊重ICCCM的说法(由fvwm的人维护)有所缓解。
我想知道其他人是否已经解决了这个问题,如果是的话。 到目前为止,我有几个选择来解决这个问题:
1)twiddle Java设置,希望如果我关掉焦点,那么它可能会把焦点控制交给窗口管理器(到目前为止,我已经在父JFrame上尝试过“setFocusable(false)”,这是行不通的。线程“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()对于调用应该是危险的......),或者我可以如何识别我正在操作的GUI(在这方面,fvwm很好,因为他们有一个GUI,允许你点击另一个GUI并找出它的“名称”和“类”)
3)使用“更强大”的窗口管理器。 一些不使用ICCCM的窗口管理器可能会更好地处理Java。 当然,还有很多经理人,我不确定要专注于什么。 同样,很多人似乎都没有明确指出应用程序的重点(大多数人似乎只关心广泛的政策)。
最后,原型在JWindow而不是JFrame中进行了重构,当JWindow调用setFocusableWindowState(false)时,Java返回焦点...问题得以解决。
链接地址: http://www.djcxy.com/p/39321.html上一篇: How do I stop/workaround Java apps stealing focus in Linux window managers