## Cómo escribir un Oyente de Key

Los eventos Key informan de cuándo el usuario ha tecleado algo en el teclado. Específiamente, los evento key son generados por el componente que tiene el foco del teclado cuando el usuario pulsa o libera las teclas del teclado. (Para más información sobre el foco del teclado, puedes ver la página Cómo escribir un Oyente de Focus.)

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:

1. Asegurarnos de que el componente puede obtener el foco del teclado. Por ejemplo, en algunos sistemas las etiquetas no pueden obtenerlo.

2. Asegurarnos de que el componente pide el foco en el momento apropiado. Para componentes personalizados, probablemente necesitaremos implementar un MouseListener que llame al método requestFocus cuandos e pulsa el ratón.

3. Si estamos escribiendo un componente personalizado, implementaremos el método isFocusTraversable del componente, para que devuelva true cuando el componente está activado. esto permie al usuario usar Tab para ir a nuestro componente.

#### Métodos de Evento Key

> 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.

#### Ejemplos de manejo de Eventos Key

> 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:
> 1. Pulsa sobre el campo de texto del applet para que obtenga el foco.
> 2. 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.
> 3. Pulsa el botón Clear.
>    Deberias hacer esto después de cada uno de los pasos siguientes.
> 4. 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.
> 5. 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).
> 6. 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.
> 7. 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...
        }
    }

#### La clase KeyEvent

> Cada método de evento key tiene un sólo parámetro: un objeto KeyEvent. La clase KeyEvent define los siguientes métodos:

> 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.
> La clase KeyEvent hereda muchos métodos de InputEvent y ComponentEvent. Los siguientes métodos están descritos en La clase MouseEvent:
> - Component getComponent()
> - void consume()
> - int getWhen()
> - boolean isAltDown()
> - boolean isControlDown()
> - boolean isMetaDown()
> - boolean isShiftDown()
> - int getModifiers()

Ozito