web-dev-qa-db-ja.com

すべてのコンポーネントで(Java Swing内で)キーの押下をリッスンするにはどうすればよいですか?

次のようなキーの組み合わせを聞きたいです Control+S Swingアプリケーションの各コンポーネントにキーリスナーを追加する必要はありません。どうすればこれを達成できますか?

26
diolemo

可能です。

KeyboardFocusManager.getCurrentKeyboardFocusManager()
  .addKeyEventDispatcher(new KeyEventDispatcher() {
      @Override
      public boolean dispatchKeyEvent(KeyEvent e) {
        System.out.println("Got key event!");
        return false;
      }
});

これですべての主要なイベントが取得されます。 falseを返すと、キーボードフォーカスマネージャーは、さまざまなコンポーネントへの通常のキーイベントディスパッチを再開できます。

キーのコンボをキャッチしたい場合は、「押されたキー」のセットを保持できます。キーが押されるたびに、それをセットに追加し、セットにすでに含まれているキーを確認します。キーがリリースされたら、セットから削除します。

55

非常に単純な私の友人:クラス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;
  }
}
0
Denis Co

あなたがしたいような「グローバルな」キーリスナーを追加する方法はないと思います。この フォーラムの投稿 に似たような質問がありました。それらを各コンポーネントに追加する必要があるだけです。ただし、これは一度だけ実行する必要があるので、問題を解決して次に進むことができると思います。

0
jbranchaud