Se pueden notificar dos tipos básicos de eventos key: la pulsación de un caracter Unicode, y la pulsación o liberación de una tecla del teclado. El primer tipo de llama evento key-typed, y el segundo son eventos key-pressed y key-released.
En general, sólo deberíamos manejar los eventos key-typed a menos que necesitemos saber cuando el usuario ha pulsado teclas que no corresponden con caracteres. Por ejmplo, si queremos saber cuando el usario teclea algún caracter Unicode -- siempre como resultado de una pulsación de tecla como 'a' de la pulsación de una secuencia de teclas -- dberíamos manejar eventos key-typed. Por otro lado, si queremos saber cuando el usuario ha pulsado la tecla F1, necesitaremos manejer eventos key-pressed.
Nota: Para generar eventos de teclado, un componente debe tener el foco del teclado.
Para hacer que un componente obtenga el foco del teclado debemos seguir estos pasos:
El interface KeyListener y su correspondiente clase adaptador, KeyAdapter, contienen tres métodos:
- void keyTyped(KeyEvent)
- Se le llama después de que el usuario teclee un caracter Unicode dentro del componente escuchado.
- void keyPressed(KeyEvent)
- Se le llama después de que el usario pulse una tecla mientras el componente escuchado tiene el foco.
- void keyReleased(KeyEvent)
- Se le llama después de que el usario libere una tecla mientras el componente escuchado tiene el foco.
El siguiente applet demuestra los eventos key. Consiste en un campo de texto en el que podemos teclear información, seguido de un área de texto que muestra un mensaje cada vez que el campo de texto dispara un evento key. Un botón en la parte inferior del applet nos permite borrar ranto el campo como el área de texto.
Esta es una imagen del GUI del applet. Para ejecutarlo, pulsa sobre ella. El applet aparecerá en una nueva ventana de tu navegador..
Prueba esto:
- Pulsa sobre el campo de texto del applet para que obtenga el foco.
- Teclea una 'a' minúscula pulsando y liberando la tecla A del teclado.
El campo de texto dispara tres eventos: un key-pressed, un key-typed, y un key-released. Observa que el evento key-typed no tiene información sobre el código de la tecla; los eventos key-typed tampoco tienen información sobre los modificadores.- Pulsa el botón Clear.
Deberias hacer esto después de cada uno de los pasos siguientes.- Pulsa y libera la tecla Shift.
El campo de texto dispara dos eventos: un key pressed y un key released. El campo de texto no genera ningún evento key-typed porque Shift, por sí misma, no corresponde con ningún carácter.- Teclea una 'A' mayúscula pulsando las teclas Shift y A.
Verás los siguientes eventos, aunque quizás no en este orden: key pressed (Shift), key pressed (A), key typed ('A'), key released (A), key released (Shift).- Teclea una 'A' mayúsculas pulsando y liberando la tecla Caps Lock, y luego pulsando la tecla A.
Deberías ver los siguientes eventos: key pressed (Caps Lock), key pressed (A), key typed ('A'), key released (A). Observa que la tecla Caps Lock no genera unevento key-released hasta que la pulses y la liberes de neuvo. Lo mismo sucede para otras teclas de estado como Scroll Lock y Num Lock.- Pulsa y mantén la tecla A..
¿Se repite automáticamente? Si es así, verás los mismos resultados que verías si pulsaras y liberaras la tecla A repetidamente.
Puedes encontrar el código del applet en
KeyEventDemo.java. Aquí puedes ver el código de manejo de eventos:
public class KeyEventDemo ... implements KeyListener ... {
...//where initialization occurs:
typingArea = new JTextField(20);
typingArea.addKeyListener(this);
...
/** Handle the key typed event from the text field. */
public void keyTyped(KeyEvent e) {
displayInfo(e, "KEY TYPED: ");
}
/** Handle the key pressed event from the text field. */
public void keyPressed(KeyEvent e) {
displayInfo(e, "KEY PRESSED: ");
}
/** Handle the key released event from the text field. */
public void keyReleased(KeyEvent e) {
displayInfo(e, "KEY RELEASED: ");
}
...
protected void displayInfo(KeyEvent e, String s){
...
char c = e.getKeyChar();
int keyCode = e.getKeyCode();
int modifiers = e.getModifiers();
...
tmpString = KeyEvent.getKeyModifiersText(modifiers);
...//display information about the KeyEvent...
}
}
Cada método de evento key tiene un sólo parámetro: un objeto KeyEvent. La clase KeyEvent define los siguientes métodos:
La clase KeyEvent hereda muchos métodos de InputEvent y ComponentEvent. Los siguientes métodos están descritos en La clase MouseEvent:
- int getKeyChar()
- void setKeyChar(char)
- Obtiene o selecciona el caracter Unicode asociado con este evento.
- int getKeyCode()
- void setKeyCode(int)
- Obtiene o selecciona el código de tecla asociado con este evento. El código de tecla identifica una tecla particular del teclado que el usuario pulsa o libera. La clase KeyEvent define muchas constantes de código de teclas para las más utilizadas. Por ejemplo, VK_A especifica la tecla A, y VK_ESCAPE especifica la tecla ESCAPE.
- void setModifiers(int)
- Selecciona el estado de las teclas modificadoras para este evento. Podemos obtener el estados de las teclas modificadores usando el método getModifiers de InputEvent.
- String getKeyText()
- String getKeyModifiersText()
- Devuelve una descripción del código de tecla y de la tecla modificadora, respectivamente.
- Component getComponent()
- void consume()
- int getWhen()
- boolean isAltDown()
- boolean isControlDown()
- boolean isMetaDown()
- boolean isShiftDown()
- int getModifiers()