web-dev-qa-db-fra.com

Как я могу слушать нажатия клавиш (в Java Swing) dans les environs?

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

26
diolemo

C'est possible.

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

Cela saisira tous les événements clés. Si vous renvoyez la valeur false, le gestionnaire de focus du clavier peut reprendre la distribution normale d'événements clés aux différents composants. 

Si vous voulez intercepter des combinaisons de touches, vous pouvez conserver un ensemble de "touches enfoncées". Chaque fois qu'une touche est enfoncée, ajoutez-la à l'ensemble et vérifiez quelles sont les clés déjà présentes dans l'ensemble. Lorsqu'une touche est relâchée, retirez-la de l'ensemble.

53
Matt Crinklaw-Vogt

Très simple mon ami: Tout ce que vous avez à faire est de créer une classe KeyEventDispatcher et de vous inscrire à KeyboardFocusManager C.1

Ensuite, analysez et extrayez les informations d'état et de clé, voir: C.2 Curieusement, vous devez obtenir le KEY STATE via ThatEvent.getID ();

SEMBLE COMME UN MANQUANT À MOI.

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

Je ne pense pas qu'il y ait un moyen d'ajouter un auditeur de clé "global" comme vous le souhaitez. Ce message de forum avec une question similaire me sauvegarde. Vous devrez simplement les ajouter à chaque composant. Cela ne devrait cependant être fait qu'une seule fois, alors je suppose que vous pouvez simplement en finir et continuer.

0
jbranchaud