Хотел бы послушать комбинации клавиш, такие какControl+Sбез добавления ключевых слушателей для каждого компонента в моем приложении Swing. Как мне этого добиться?
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.
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;
}
}
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.