既存の Java アプリにキーボード ショートカットを追加しようとしています。関連する部分は次のとおりです。
public final class Main{
...
private MyKeyEventDispatcher keyDispatcher; /*implements KeyEventDispatcher*/
...
KeyboardFocusManager manager =KeyboardFocusManager.getCurrentKeyboardFocusManager();
keyDispatcher = new MyKeyEventDispatcher(this);
manager.addKeyEventDispatcher(keyDispatcher);
viewer = makeJViewer(); /*an extension of JPanel, which shows a video stream.*/
...
}
現在、キーボード フォーカス システムは、ソフトウェア レンダリングで期待どおりに機能します。ただし、GL レンダリング サポートが追加されたため、動作が異なります。プログラムを起動すると、キーボード マネージャーは正常に動作します。の子オブジェクトにMainフォーカスがあり、フォーカス マネージャは で定義されているように動作しMainます。ただし、ストリームビデオボタンをクリックすると、つまり。Jviewer 内の内部 JPanel が初めてレンダラーされると、同じボタンとパネルがフォーカスを維持しますが、キーボード マネージャーが突然動作しなくなります。キーボードを再び機能させるには、Jviewer またはボタンなどの GUI ツールをクリックするか、プログラムでタブアウトしてからタブインする必要があります。その後、正常に動作します。また、これはストリームが最初に読み込まれたときにのみ発生します。
また、この動作は私の Windows マシンでのみ発生し、Linux マシンは同じ (maven) ビルドを問題なく処理することにも注意してください。興味深いのは、IntelliJ ビルド環境で JDK Java 1.6.0.39 を使用して同じプログラムを実行すると、Windows でも正常に動作することです。
私の質問は次のとおりです。
- 問題の原因は何ですか? これらの内部ストリーム JPanels のレンダリング後、Jviewer はどういうわけか「再検証」されませんか?
- 同じビルドが Windows では機能するのに Linux では機能しないのはなぜですか? ルックアンドフィールと何か関係がありますか?
- Windows では、IntelliJ ビルドが正常に動作し、Maven ビルドが動作しないのはなぜですか? ライブラリなどを検索するためのパスのセットが異なるようです。
フォーカス サブシステムは、使用する をどのように決定し
KeyboardFocusManagerますか? 次のようなものはありますか:getCurrentKeyboardFocusManager().isItBlank()またはそのコンテンツをプログラムでチェックする方法はありますか?残念ながら、プロジェクトはかなりモジュール化されており、「メイン」パッケージが「Swing」をインポートし、Java が循環依存を好まないため、「swing パッケージ」でキーボード ショートカットのアクションを定義できません。そうでない場合は、Jviewer を含む各子オブジェクトのキーボード マネージャーを個別に定義できますが、できません。特定のウィンドウ内のすべてのコンポーネントが同じを使用するように設定するプロパティはあります
KeyboardFocusManagerか?
参考までに、Maven バージョン: 3.2.5 で、IDE と同じ Java JDK を使用しています。