Как я могу прослушивать нажатия клавиш (внутри Java Swing) для всех компонентов?

Я хотел бы прослушивать комбинации клавиш, такие как Control + S без добавления ключевых слушателей для каждого компонента в моем приложении Swing. Как я могу достичь этого?

Ответ 1

Возможно.

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

Это захватит все ключевые события. Возврат false позволяет диспетчеру фокуса клавиатуры возобновить обычную диспетчеризацию событий для различных компонентов.

Если вы хотите поймать ключевые комбо, вы можете сохранить набор "нажатых клавиш". Всякий раз, когда нажата клавиша, добавьте ее в набор и проверьте, какие клавиши уже установлены. Когда ключ освобожден, удалите его из набора.

Ответ 2

Я не думаю, что есть способ добавить "глобального" прослушивателя клавиш, как вы этого хотите. Это сообщение с похожим вопросом подталкивает меня. Вам просто нужно добавить их к каждому компоненту. Это нужно делать только один раз, поэтому, я думаю, вы можете просто с этим справиться и двигаться дальше.

Ответ 3

Очень простой мой друг: Все, что вам нужно сделать, это создать класса KeyEventDispatcher и зарегистрируйтесь в KeyboardFocusManager C.1

Затем проанализировать и извлечь состояние и информацию о ключе: C.2    Как ни странно, вы должны получить KEY STATE через ToEvent.getID();

ПОСМОТРЕТЬ СООБЩЕНИЕ МЫ.

///////////////////////////////////////////////////////////////////////////////////////////   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;
  }
}