10

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

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

如果我用 Java 应用程序运行它,它就不起作用(只要鼠标在 Java GUI 上它就有键盘焦点)——如果我用一些标准的 X GUI 小部件(XEyes)代替 Java GUI,它就像一个魅力. 这为 Java 不尊重 ICCCM 的说法(由 fvwm 的人员维护)提供了一些可信度。

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

1)旋转Java设置,希望如果我在那里关闭焦点,它可能会将焦点控制交还给窗口管理器(到目前为止,我已经在父JFrame上尝试过“setFocusable(false)”。这不起作用。A线程“ 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。当然,经理太多了,我不知道该专注于什么。同样,许多似乎缺乏按应用指定重点(大多数似乎只关心广泛的政策)。

4

1 回答 1

5

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

于 2010-05-12T16:17:42.563 回答