10

Java でウィジェットのプロトタイプをすばやく作成したいと考えています。独自のサードパーティ製グラフィック パッケージで記述されたディスプレイの上にそれらをオーバーレイします。Java GUI がキーボード フォーカスをウィンドウ マネージャから奪っていることがわかりました。

ウィンドウ マネージャーは fvwm です。Java アプリがフォーカスを取得しないように設定し、フォーカスを取得した場合はそれを他の GUI に渡すように構成しようとしました。

これをJavaアプリで実行すると機能しません(マウスがJava GUIの上にあるときはいつでもキーボードフォーカスがあります)-Java GUIの代わりに標準のX GUIウィジェット(XEyes)を交換すると、魅力的に機能します. これは、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 はまだウィンドウでやり直されていませんが、Javaがフォーカスを放棄すると完全に確信していません

2) JNI を使用して Java プログラムで低レベルの X 呼び出しを行います。これはおそらくうまくいくと思いますが、低レベルの X であまり遊んだことがありません。どの呼び出しを使用すべきか (XtSetKeyboardFocus() を呼び出すのは危険なはずです...)、またはどのように識別できるかわかりません私が操作している GUI (この点で、fvwm は別の GUI をクリックしてその「名前」と「クラス」を見つけることができる GUI を持っていたので良かった)

3) 「より強力な」ウィンドウ マネージャを使用します。ICCCM を使用しない一部のウィンドウ マネージャーは、Java をより適切に処理できる場合があります。もちろん、管理職は山ほどいて、何に集中すればいいのかわからない。同様に、多くの企業はアプリごとに重点を置いているように見えません (ほとんどの企業は、広範なポリシーのみに関心があるようです)。

4

1 に答える 1

5

最後に、プロトタイプは JFrame ではなく JWindow で作り直され、その JWindow で setFocusableWindowState(false) が呼び出されたとき、Java はフォーカスを戻しました... 問題は解決しました。

于 2010-05-12T16:17:42.563 に答える