Как я могу слушать нажатия клавиш (в Java Swing) во всех компонентах? - PullRequest
26 голосов
/ 17 марта 2011

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

Ответы [ 3 ]

54 голосов
/ 17 марта 2011

Это возможно.

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

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

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

0 голосов
/ 04 июня 2012

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

Затем проанализировать и извлечь информацию о состоянии и ключах, см .: C.2 Как ни странно, у тебя естьчтобы получить КЛЮЧЕВОЕ СОСТОЯНИЕ через ThatEvent.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;
  }
}
0 голосов
/ 17 марта 2011

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

...