usar - ¿Cómo puedo escuchar las pulsaciones de teclas(dentro de Java Swing) en todos los componentes?
usar enter en java (3)
Me gustaría escuchar combinaciones de teclas como Control + S sin agregar oyentes clave a cada componente en mi aplicación Swing. ¿Cómo puedo conseguir esto?
Es posible.
KeyboardFocusManager.getCurrentKeyboardFocusManager()
.addKeyEventDispatcher(new KeyEventDispatcher() {
@Override
public boolean dispatchKeyEvent(KeyEvent e) {
System.out.println("Got key event!");
return false;
}
});
Eso atrapará todos los eventos clave. Si se devuelve falso, el administrador de foco del teclado reanudará el envío normal de eventos clave a los diversos componentes.
Si desea capturar combinaciones de teclas, puede mantener un conjunto de "teclas presionadas". Cada vez que se presiona una tecla, agréguela al conjunto y verifique qué teclas ya están en el conjunto. Cuando se suelta una tecla, retírela del conjunto.
Muy simple amigo mío: todo lo que tienes que hacer es crear una clase KeyEventDispatcher y registrarte en KeyboardFocusManager C.1
A continuación, analice y extraiga el estado y la información clave, vea: C.2. Aunque parezca extraño, debe obtener el ESTADO CLAVE a través de ThatEvent.getID ();
PARECE COMO UN MISSNOMER PARA MÍ.
/////////////////////////////////////////////////////////////////////////////////////////// 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;
}
}
No creo que haya una forma de agregar un oyente de clave "global" como lo que quiere hacer. Esta publicación del foro con una pregunta similar me respalda. Simplemente va a tener que agregarlos a cada componente. Sin embargo, esto solo debería hacerse una vez, así que supongo que puedes terminarlo y seguir adelante.