Java: tratamento de entrada de teclado combinado
-
03-07-2019 - |
Pergunta
O que é a maneira correta de separar entre F1 e isto é Ctrl + F1 respectivo Shift - CTRL + F1 dentro de uma KeyListener registrado por trás ou seja, um JButton?
public void keyPressed(KeyEvent event) {
int key = event.getKeyCode();
logger.debug("KeyBoard pressed char(" + event.getKeyChar() + ") code (" + key + ")");
}
.. sempre me dá 112 para F1 , 113 para F2 e assim por diante. Eu entendo que eu posso lidar com isso por cuidar do keyPressed () respectivo para keyReleased para Ctrl / Shift / ALT / etc na minha própria , mas espero que não há uma maneira melhor.
Muitos muitos agradecimentos !!!
Solução
As mentiras solução na matriz de KeyEvent (InputEvent)
- Use o isAltDown, isControlDown, métodos isShiftDown ou
- Use o método getModifiers
Outras dicas
Desde KeyEvent estende InputEvent, isControlDown , isShiftDown e isAltDown .
KeyEvent
s são provavelmente um baixo nível pouco quando se lida com um widget de Swing. Em vez de ir através InputMap
e ActionMap
.
A chave para baixo o evento é chamado sempre que uma tecla é baixo, obviamente. A sua não é uma chave múltipla para baixo o evento, e não há tal coisa, então não há nenhum código de acesso para várias chaves estar para baixo.
Você está apenas vai ter de usar uma variável para manter o controle da chave crtl sendo pressionado. Isso significa que você também vai ter que usar um evento chave para cima para manter o controle de quando a chave de controle é liberada.
No 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; }