Javaでグローバルキープレスをキャプチャする
質問
ユーザーがSwingアプリの任意の場所でスペースバーを押すたびに、イベント(一部のメディアの一時停止/一時停止解除)をトリガーします。
フォーカスできるコントロールとパネルが非常に多いため、それらすべてにキーイベントを追加することは実際には不可能です(グロスは言うまでもありません)。
だから見つけた
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()
これは素晴らしいことです。グローバルキープレスプリハンドラーを登録できます。ただし、大きな問題があります-入力フィールド、テーブルセルなどに常にスペースが入力されるため、一時停止イベントをトリガーしたくないのは明らかです!
では、アイデアはありますか? おそらく、すべての編集可能なコントロールのリストを確認することなく、テキスト入力が可能なものにカーソルがフォーカスされているかどうかをグローバルに検出する方法があります(vomit!)?
解決
あなたは自分で答えたと思う-はい、フォーカスがある現在の要素を見つけることができ、特定のフィールドクラスのインスタンスである場合、一時停止イベントのためにスペースを無視すると思います。重い手縫いの場合は、心配しないで、instanceofはJVMに対して非常に高速です(そして、何らかの理由で、プロセッサにとって1世代である人間規模のイベントを話します)。
他のヒント
Swingにさびていますが、 Toolkit.addAWTEventListener と KEY_EVENT_MASK
その後、そのタイプとソースに基づいてAWTEvent処理をフィルタリングできます。
OK ... ソースに基づいてフィルタリングしようとしています。問題は私の編集可能なコンボボックスです... それらはinstanceofです
javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField
BorderlessTextFieldはプライベート内部クラスであるため、私は明らかにそれに対してinstanceofチェックを実行できません。
アイデア?
編集: わかりましたので、これは動作します。
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() {
public boolean postProcessKeyEvent(KeyEvent e) {
if (e.getID() == KeyEvent.KEY_PRESSED) {
Object s = e.getComponent();
if (!(s instanceof JTextField) &&
!(s instanceof JTable && ((JTable) s).isEditing())
) {
music_player.pauseEvent();
}
//System.out.println(s.getClass().toString());
}
return true;
}
});
それは完全にひどく、私は嫌いです。 キー押下がコンポーネントによって消費されているかどうかを確認する方法を見つけてほしい-キー押下がどのコンポーネントからも操作されていない場合にのみ一時停止イベントを実行できます。