次のようなキーの組み合わせを聞きたいです Control+S Swingアプリケーションの各コンポーネントにキーリスナーを追加する必要はありません。どうすればこれを達成できますか?
可能です。
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
System.out.println("Got key event!");
return false;
}
});
これですべての主要なイベントが取得されます。 falseを返すと、キーボードフォーカスマネージャーは、さまざまなコンポーネントへの通常のキーイベントディスパッチを再開できます。
キーのコンボをキャッチしたい場合は、「押されたキー」のセットを保持できます。キーが押されるたびに、それをセットに追加し、セットにすでに含まれているキーを確認します。キーがリリースされたら、セットから削除します。
非常に単純な私の友人:クラスKeyEventDispatcherを作成し、KeyboardFocusManager C.1に登録するだけです。
次に、状態とキー情報を解析して抽出します。
私にとってミスノマーのようなシーム。
/////////////////////////////////////////////////////////////////////////////////////////// C.1)
KeyDispatcher ThisKeyDispatcher = new KeyDispatcher();
KeyboardFocusManager ThisKbFocusMngr = KeyboardFocusManager
. getCurrentKeyboardFocusManager();
ThisKbFocusMngr . addKeyEventDispatcher(ThisKeyDispatcher);
return ThisKeyDispatcher;
///////////////////////////////////////////////////////////////////////////////////////////
C.2
public static class KeyDispatcher implements KeyEventDispatcher {
public boolean dispatchKeyEvent(final KeyEvent ThatEvent) {
KeyboardFocusManager ThisKbFocusMngr = null;
Component ThisComponent = null;
Container ThisRoot = null;
Window ThisWindow = null;
int ThisKeyStateEvent = 0;
try {
ThisKbFocusMngr = KeyboardFocusManager . getCurrentKeyboardFocusManager();
ThisComponent = ThisKbFocusMngr . getFocusOwner();
ThisRoot = ThisKbFocusMngr . getCurrentFocusCycleRoot();
ThisWindow = ThisKbFocusMngr . getActiveWindow();
ThisKeyStateEvent = ThatEvent.getID(); // i.e. KeyEvent.KEY_RELEASED
if(false == ThatEvent.isConsumed()) {
boolean RetBool = false;
if((KeyEvent.VK_BACK == ThatEvent.getKeyCode())) {
RetBool = true;
} else {
RetBool = m_CallSomeoneEvent(ThatEvent);
}
if(RetBool) {
ThatEvent.consume();
return true;
}
}
}
catch( Throwable e ) {
LogThis(". ", e);
}
return false;
}
}
あなたがしたいような「グローバルな」キーリスナーを追加する方法はないと思います。この フォーラムの投稿 に似たような質問がありました。それらを各コンポーネントに追加する必要があるだけです。ただし、これは一度だけ実行する必要があるので、問題を解決して次に進むことができると思います。