Eventos, elementos a la escucha y clases de adaptador

A los eventos JavaBeans se les envían señales cuando se produce actividad, como por ejemplo la pulsación de un botón o el cierre de una ventana. El editor visual de Java muestra eventos en la vista de árbol JavaBeans, y 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.

Se podría querer añadir un evento a un JavaBean si se quiere 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 de Java que desencadena el evento es el fuente, y el objeto que se invoca cuando se produce el evento se denomina objeto a la escucha. Los JavaBean tienen una interfaz que les permite notificar a los objetos a la escucha de cada evento, así como métodos para añadir y eliminar objetos a la escucha.

Por lo general, si el JavaBean fuente tiene un método XXX, hay una interfaz a la escucha, XXXListener y dos métodos. Es importante que XXXListener amplíe a 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 a 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 a la escucha, java.awt.event.MouseMotionListener, implementa los dos métodos siguientes:

Para añadir un objeto a la escucha del 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 desencadena 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 modificada en el JavaBean que ha provocado la desencadenación del evento
Object getNewValue() Valor nuevo de la propiedad
Object getOldValue() Valor de la propiedad antes de cambiar

Para registrar interés sobre los cambios en la 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 en la 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 (objeto a la escucha)
  3. La clase que implementa la lógica que se lleva a cabo cuando se realiza la llamada de retorno del objeto a la 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 de Java se tratan en el apartado Generación de código de evento.

Clases 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 a la 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 sólo alguno de los métodos contiene realmente código. Esto se muestra a continuación, donde se utiliza FocusListener para realizar alguna lógica cuando un javaBean obtiene el enfoque. No obstante, hay que proporcionar un método focusLost (para cuando se pierde el enfoque).

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 la creación de muchos métodos de escucha vacíos correspondientes a otros tantos objetos a la escucha, se proporcionan las clases adaptadoras. Éstas implementan la interfaz a la escucha y proporcionan implementaciones vacías que no realizan operación alguna para sus métodos. La ventaja es que el objeto a la escucha puede extenderlos y sólo 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();     
         }  
   });

El editor visual es capaz de reconocer y trabajar con clases Adaptador, y en el apartado Eventos BeanInfo se describe la forma en que se pueden asociar las clases adaptadoras a sus propios eventos en el editor visual.

Tema padre: Gestión de eventos con el editor visual

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