## Manejo de Eventos

Cada vez que el usuario teclea un caracter o pulsa un botón del ratón, ocurre un evento. Cualquier puede ser notificado del evento. Todo lo que tiene que hacer es implementar el interface apropiado y ser registrado como un oyente de evento del evento fuente apropiado. Los componentes Swing puede generar muchas clases de evento. Aquí hay unos pocos ejemplos:

> Acción que resulta en el evento | Tipo de oyente
> --- | ---
> El usuario pulsa un botón, presiona Return mientras teclea en un campo de texto, o elige un ítem de menú. | ActionListener
> El usuario elige un frame (ventana principal). | WindowListener
> El usuario pulsa un botón del ratón mientras el cursor está sobre un componente. | MouseListener
> El usuario mueve el cursor sobre un componente. | MouseMotionListener
> El componente se hace visible. | ComponentListener
> El componente obtiene obtiene el foco del teclado. | FocusListener
> Cambia la tabla o la selección de una lista. | ListSelectionListener

Cada evento está representado por un objeto que ofrece información sobre el evento e identifica la fuente. Las fuentes de los eventos normalmente son componentes, pero otros tipos de objetos también pueden ser fuente de eventos. Como muestra la siguiente figura, cada fuente de evento puede tener varios oyentes registrados. Inversamente, un sólo oyente puede registrarse con varias fuentes de eventos.

    event       event object     /----> event listener
    source ---------------------------> event listener
                                 \----> event listener

    Descripción: Múltiples oyentes pueden ser registrados para ser
    notificados de eventos de un tipo particular sobre una fuente particular.

Cuando queramos detectar los eventos de un componente determinado, primero debemos chequear la sección "Cómo se usa" el componente. Esta sección ofrece ejemplos de manejo de eventos de los que querrás utilizar. Por ejemplo, Cómo crear Frames ofrece un ejemplo de escritura de un oyente de window que sale de la aplicación cuando se cierra el frame.

#### Cómo Implementar un Manejador de Eventos

> Todo manejador de eventos requiere tres partes de código:
> 1. Donde se declare la clase del manejador de eventos, el código especifica que la clase o implementa un interface de oyente, o desciende una clase que implementa un interface de oyente. Por ejemplo:

>        public class MyClass implements ActionListener {

> 2. El código que registra un ejemplar de la clase de manejo de eventos de un oynete sobre uno o más componentes. Por ejemplo:

>        someComponent.addActionListener(instanceOfMyClass);

> 3. La implementación de los métodos del interface oyente. Por ejemplo:

>        public void actionPerformed(ActionEvent e) {
>            ...//code that reacts to the action...
>        }

> Un escenario de manejo de eventos típico ocurre con los botones (JButton). Para detectar cuando el usuario pulsa un botón de la pantalla (o pulsa la tecla equivalente), un programa debe tener un objeto que implementa el interface ActionListener. El programa debe registrar este objeto como un oyente de actión del botón (la fuente del evento), usando el método addActionListener. Cuando el usuario pulsa el botón de la pantalla, éste dispara el evento action, Esto resulta en una llamada al método actionPerformed del oyente de action, el único método del interface ActionListener). El único argumento del método es un objeto ActionEvent que ofrece información sobre el evento y su fuente.

>                   ActionEvent
>     button ----------------------------> action listener

>     Descripción: Cuando el usuario pulsa un botón, los oyentes
>     de action del botón son notificados.

> Los manejadores de eventos pueden ser ejemplares de cualquier clase. Frecuentemente, se implementan usando clases internas anónimas, lo que puede hacer el códio algo más confuso -- hasta que hayas usado las clases internas. Para más información sobre el uso de clases internas, puedes ver Usar Adaptadores y Clases Internas para Manejar Eventos.

> Para más información sobre la implementación de manejo de eventos, puedes ver Escribir Oyentes de Eventos.

#### Los Threads y el Manejo de Eventos

> El código de manejo de eventos se ejecuta en un sólo threadm el thread de despacho de eventos. Esto asegura que todo manejador de eventos se terminará de ejecutar antes de ejecutar otro. Por ejemplo, el método actionPerformed del ejemplo anterior se ejecuta en el thread de manejo de eventos. El código de dibujo también se realiza en el thread de despacho de eventos. Esto significa que mientras se está ejecutando el método actionPerformed, el GUI del programa está congelado -- no se dibujará nada ni se responderá a las pulsaciones del ratón, por ejemplo.

> > Importante: El código de manejo de eventos debería ejecutar cada pulsación! De otro modo, el rendimiento de tu programa se vería empobrecido. Si necesitas hacer una operación de larga operación como resultado de un evento, hazlo arrancando un nuevo thread (o de otro modo enviándo una petición a otro thread) para realizar la operación. Para obtener ayuda sobre le uso de threads, puedes ver Cómo usar Threads.

Ozito