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.
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
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.
Todo manejador de eventos requiere tres partes de código: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.
- 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 {
- 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);
- La implementación de los métodos del interface oyente. Por ejemplo:
public void actionPerformed(ActionEvent e) { ...//code that reacts to the action... }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.
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.