Java: manejo de entrada de teclado combinada
-
03-07-2019 - |
Pregunta
¿Cuál es la forma correcta de separar entre F1 y CTRL + F1 respectivo SHIFT - CTRL + F1 dentro de un KeyListener registrado detrás, es decir, un JButton?
public void keyPressed(KeyEvent event) {
int key = event.getKeyCode();
logger.debug("KeyBoard pressed char(" + event.getKeyChar() + ") code (" + key + ")");
}
.. siempre me da 112 para F1 , 113 para F2 y así sucesivamente. Entiendo que puedo manejarlo cuidando keyPressed () respectivo para keyReleased para CTRL / SHIFT / ALT / etc por mi cuenta , pero espero que haya una mejor manera.
Muchas muchas gracias !!!
Solución
La solución está en el padre de KeyEvent (InputEvent)
- Utilice los métodos isAltDown, isControlDown, isShiftDown o
- Usa el método getModifiers
Otros consejos
Dado que KeyEvent extiende InputEvent, isControlDown , isShiftDown y isAltDown .
KeyEvent
son probablemente un poco de bajo nivel cuando se trata de un widget Swing. En su lugar, vaya a InputMap
y ActionMap
.
El evento de desactivación de clave se invoca siempre que una clave está inactiva, obviamente. No es un evento de varias teclas hacia abajo, y no existe tal cosa, por lo que no hay ningún código de clave para que varias teclas no estén activas.
Solo tendrá que usar una variable para mantener un registro de la tecla crtl que se presiona. Esto significa que también tendrá que usar un evento de activación de clave para realizar un seguimiento de cuándo se suelta la tecla de control.
En código pusedo:
// CRTLKeyCode is whatever the code is for the ctrl key private boolean ctrlPressed = false; onKeyDown(KeyEvent event){ int key = event.getKeyCode(); if(key == CRTLKeyCode) ctrlPressed = true; else if(ctrlPressed && key == 112) //Perform your action } onKeyUp(KeyEvent event){ int key = event.getKeyCode(); if(key == CRTLKeyCode) ctrlPressed = false; }