Eventos, escuchas y clases de adaptador

Los eventos JavaBeans se les señala cuando se produce una actividad, como que se pulsa un botón o se cierra una ventana. El editor visual Java muestra eventos en la vista Beans Java, y esta vista le permite añadir y eliminar eventos.

La lista de eventos definidos para un JavaBean se describe en su clase BeanInfo, que también controla los eventos más utilizados o preferidos.

Puede interesarle añadir un evento a un JavaBean si desea que pase algo cuando se genera el JavaBean, como la actualización de una base de datos cuando se pulsa un botón. El Bean Java que desencadena el evento es el origen, y el objeto al que se llama cuando se produce el evento se conoce como listener (escucha). Los JavaBean tienen una interfaz que les permite notificar a los escuchas cada evento, así como métodos para añadir y eliminar escuchas.

Por lo general, si el JavaBean origen tiene un método XXX, hay una interfaz de escucha, XXXListener, y dos métodos. Es importante que XXXListener amplíe java.util.EventListener. Si no es así, y a menos que se proporcione un BeanInfo concreto, el evento no se descubrirá.

Los métodos en la propia interfaz XXXListener dependen de la semántica del evento, pero el convenio es que su firma sea void <eventOccurenceMethodName>(<EventStateObjectType> evt);. Es importante que XXXListener amplíe java.util.EventObject. Si no es así, y a menos que se proporcione un BeanInfo concreto, el evento no se descubrirá.

El JavaBean java.awt.Component es un ejemplo de evento que desencadena eventos cuando el ratón se mueve sobre él. La interfaz de escucha, java.awt.event.MouseMotionListener, implementa los dos métodos siguientes:

Para añadir un escucha de ratón, java.awt.Component tiene los dos métodos siguientes:

El segundo estilo de evento lo genera un JavaBean cuando cambia un valor de propiedad. Un ejemplo de esto es la propiedad 'enabled' (habilitado) de javax.swing.JButton. Una propiedad que dispara un evento cuando se cambia su valor se denomina propiedad enlazada. En vez de tener una interfaz de escucha distinta para cada propiedad enlazada, hay una interfaz de escucha genérica java.beans.PropertyChangeListener que tiene un único método de llamada de retorno void propertyCanged(PropertyChangeEvent evt);. El argumento PropertyChangeEvent tiene tres métodos que el receptor del método puede consultar:

String getPropertyName() Nombre de la propiedad cambiada en el JavaBean que ha provocado que se dispare el evento
Objeto getNewValue() Valor nuevo de la propiedad
Objeto getOldValue() Valor de la propiedad antes de cambiar

Para registrar interés en los cambios de propiedad de un JavaBean, hay dos métodos: void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);

El primero de estos métodos siempre está presente en un JavaBean con propiedades enlazadas. No obstante, el segundo es opcional, y depende del estilo de registro del evento utilizado por el autor del JavaBean. Por ejemplo, los componentes AWT utilizan el primer estilo de registro de cambio de propiedad, mientras que los componentes Swing utilizan ambos estilos.

Para utilizar un evento hay tres objetos:

  1. El JavaBean que desencadena el evento (el origen)
  2. La clase que recibe la notificación desde el origen (el escucha)
  3. La clase que implementa la lógica que se lleva a cabo cuando se llama de nuevo al escucha.

Por lo general, los dos últimos se combinan, de forma que la clase que ejecuta la lógica implementa directamente la interfaz de escucha o bien utiliza una clase interior. Los estilos de código que reconoce y genera el editor visual Java se tratan en el apartado Generación de código de evento.

Clases de adaptador

Muchas interfaces de escucha tienen más de un método de llamada de retorno. java.awt.FocusListener es un ejemplo que tiene dos métodos; focusGained(java.awt.FocusEvent event) y focusLost(java.awt.FocusEvent event). Cuando se crea una clase de escucha que implementa la interfaz que el compilador Java obliga a que se implementen todos los métodos de interfaz, a veces se crean muchos métodos vacíos para satisfacer sus requisitos, aunque solo alguno de los métodos contiene realmente código. La sentencia siguiente muestra un FocusListener que se utiliza para realizar alguna lógica cuando un bean Java obtiene el foco. No obstante, hay que proporcionar un método focusLost (para cuando se pierde el foco).

javaBean.addFocusListener(new java.awt.event.FocusListener() {      
    public void focusGained(java.awt.event.FocusEvent e) {          
        doFocusGainedCode();      
     }          
        public void focusLost(java.awt.event.FocusEvent e) {      
     }  
});

Para evitar tener muchos métodos de escucha vacíos correspondientes a muchos escuchas, se proporcionan las clases de adaptador. Estas implementan la interfaz de escucha y proporcionan implementaciones vacías que no realizan operación alguna para sus métodos. La ventaja es que el escucha puede ampliarlos y solo hay que especializar los métodos necesarios, sin tener que proporcionar implementaciones por omisión para el resto (ya que se heredan del Adaptador).

javaBean.addFocusListener(new java.awt.event.FocusAdapter() {     
     public void focusGained(java.awt.event.FocusEvent e) {          
         doFocusGainedCode();      
         }  
   });
Tareas relacionadas
Ver los eventos de un componente
Añadir eventos a un componente
Suprimir eventos de un componente
Ver el fuente de un evento

(C) Copyright IBM Corporation 1999, 2004. Reservados todos los derechos.