Beans (Básico)

Algunas veces cuando cambia una propiedad de un Bean, otros objetos podr�an querer ser notificados del cambio y tomar alguna acci�n bas�ndose en ese cambio. Cuando una propiedad compartida cambia, la notificaci�n del cambio se env�a a los oyentes interesados.

Un Bean que contiene una propiedad compartidas debe mantener una lista de los oyentes de la propiedad, y alertar a dichos oyentes cuando cambie la propiedad. La clase PropertyChangeSupport implementa m�todos para a�adir y eliminar objetos PropertyChangeListener de una lista, y para lanzar objetos PropertyChangeEvent a dichos oyentes cuando cambia la propiedad compartida. Nuestros Beans pueden descender de esta clase, o utilizar una clase interna.

Un objeto que quiera escuchar los cambios de una propiedad debe poder a�adirse o eliminarse de la lista de oyentes del Bean que contiene la propiedad, y responder al m�todo de notificaci�n del evento que se�ala que la propiedad ha cambiado. Implementando el interface PropertyChangeListener el oyente puede ser a�adido a la lista mantenida por el Bean de la propiedad compartida, y como implementa el m�todo PropertyChangeListener.propertyChange(), el oyente puede responder a las notificaciones de cambio de la propiedad.

La clase PropertyChangeEvent encapsula la informaci�n del cambio de la propiedad, y es enviada desde la fuente del evento de cambio de propiedad a cada objeto de la lista de oyentes mediante el m�todo propertyChange().

Las siguientes secciones proporcionan los detalles de la implementaci�n de propiedades compartidas.

.�Implementar Propiedades Compartidas dentro de un Bean

Como ya habr�s le�do, un Bean que contenga propiedades compartidas deber�.

  • Permitir a sus oyentes registrar o eliminar su inter�s en recibir eventos de cambio de propiedad.
  • Disparar eventos de cambio de propiedad a los oyentes interesados.

La clase PropertyChangeSupport implementa dos m�todos para a�adir y eliminar objetos PropertyChangeListener de una lista de oyentes, e implementa un m�todo que dispara eventos de cambios de propiedad a cada uno de los oyentes de la lista. Nuestro Bean puede descencer de PropertyChangeSupport, o utilizarla como clase interna.

Para implementar una propiedad compartida, seguiremos estos pasos.

  1. Importaremos el paquete java.beans, esto nos da acceso a la clase PropertyChangeSupport.
  2. Ejemplarizar un objeto PropertyChangeSupport.
    private PropertyChangeSupport changes = new PropertyChangeSupport(this);
    

    Este objeto mantiene una lista de oyentes del cambio de propiedad y lanza eventos de cambio de propiedad.

  3. Implementar m�todos para mantener la lista de oyentes. Como PropertyChangeSupport implementa esto m�todos s�lo tenemos que envolver las llamadas a los m�todos del objeto soportado.
          public void addPropertyChangeListener(PropertyChangeListener l) {
            changes.addPropertyChangeListener(l);
          }
          public void removePropertyChangeListener(PropertyChangeListener l) {
            changes.removePropertyChangeListener(l);
          }
    
  4. Modificar un m�todo de selecci�n de la propiedad para que lance un evento de cambio de propiedad.
          public void setLabel(String newLabel) {
            String oldLabel = label;
            label = newLabel;
            sizeToFit();
            changes.firePropertyChange("label", oldLabel, newLabel);
          }
    

    Observa que setLabel() almacena el valor antiguo de label, porque los dos valores, el nuevo y el antiguo deben ser pasados a firePropertyChange().

          public void firePropertyChange(String propertyName,
                                         Object oldValue, Object newValue)
    

    firePropertyChange() convierte sus par�metros en un objeto PropertyChangeEvent, y llama a propertyChange(PropertyChangeEvent pce) de cada oyente registrado. Observa que los valores nuevo y antiguo son tratados como valores Object, por eso si los valores de la propiedad son tipos primitivos como int, se debe utilizar la versi�n del objeto java.lang.Integer. Observa tambi�n que el evento de cambio de propiedad se dispara despu�s de que la propiedad haya cambiado.

Cuando el BeanBox reconoce el patr�n de dise�o de una propiedad compartida dentro de un Bean, se ver� un interface propertyChange cuando se despliege el men� Edit|Events.

Ahora que hemos dada a nuestro Bean la habilidad de lanzar eventos cuando cambia una propiedad, el siguiente paso es crear un oyente.

.�Implementar Oyentes de Propiedades Compartida

Para oir los eventos de cambio de propiedad, nuestro Bean oyente debe implementar el interface PropertyChangeListener. Este interface contiene un m�todo.

   public abstract void propertyChange(PropertyChangeEvent evt)

El Bean fuente llama a este m�todo de notificaci�n de todos los oyentes de su lista de oyentes.

Por eso para hacer que nuestra clase pueda oir y responder a los eventos de cambio de propiedad, debe.

  1. Implementar el interface PropertyChangeListener.
          public class MyClass implements java.beans.PropertyChangeListener,
                                                       java.io.Serializable { 
    
  2. Implementar el m�todo propertyChange() en el oyente. Este m�todo necesita contener el c�digo que maneja lo que se necesita hacer cuando el oyente recibe el evento de cambio de propiedad. Por ejemplo, una llamada a un m�todo de selecci�n de la clase oyente: un cambio en una propiedad del Bean fuente se propaga a una propiedad del Bean oyente.

Para registrar el inter�s en recibir notificaciones sobre los cambios en una propiedad de un Bean, el Bean oyente llama al m�todo de registro de oyentes del Bean fuente, por ejemplo.

button.addPropertyChangeListener(aButtonListener);

O se puede utilizar una clase adaptador para capturar el evento de cambio de propiedad, y subsecuentemente llamar al m�todo correcto dentro del objeto oyente. Aqu� tienes un ejemplo tomado de los ejemplos comentados del fichero beans/demo/sunw/demo/misc/ChangeReporter.java.

OurButton button = new OurButton();
...
PropertyChangeAdapter adapter = new PropertyChangeAdapter();
...
button.addPropertyChangeListener(adapter);
...
class PropertyChangeAdapter implements PropertyChangeListener
{
  public void propertyChange(PropertyChangeEvent e)
  {
    reporter.reportChange(e);
  }
}

.�Propiedades Compartida en el BeanBox

El BeanBox maneja las propiedades compartida utilizando una clase adaptador. Los Beans OurButton y ChangeReporter pueden ser utilizados para ilustrar esta t�cnica. Para ver como funciona, seguiremos estos pasos.

  1. Arrastar ejemplares de OurButton y de ChangeReporter al BeanBox.
  2. Seleccionar el ejemplar de OurButton y elegir el men� Edit|Events|propertyChange|propertyChange.
  3. Conectar la l�nea que aparece al ejemplar de ChangeReporter. Se mostrar� el cuadro de di�logo EventTargetDialog.
  4. Elegir reportChange desde EventTargetDialog. Se generar� y compilar� la clase adaptador de eventos.
  5. Seleccionar OurButton y cambiar alguna de sus propiedades. Veras informes de cambios en ChangeReporter.

Detr�s de la escena, el BeanBox genera el adaptador de eventos. Este adaptador implementa el interface PropertyChangeListener, y tambi�n genera una implementaci�n del m�todo propertyChange() que llama el m�todo ChangeReporter.reportChange(). Aqu� tienes el c�digo fuente del adaptador generado.

// Automatically generated event hookup file.
package tmp.sunw.beanbox;
import sunw.demo.misc.ChangeReporter;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;

public class ___Hookup_14636f1560 implements
            java.beans.PropertyChangeListener, java.io.Serializable {

    public void setTarget(sunw.demo.misc.ChangeReporter t) {
        target = t;
    }

    public void propertyChange(java.beans.PropertyChangeEvent arg0) {
        target.reportChange(arg0);
    }

    private sunw.demo.misc.ChangeReporter target;
}

El Bean ChangeReporter no necesita implementar el interface PropertyChangeListener; en su lugar, la clase adaptador generada por el BeanBox implementa PropertyChangeListener, y el m�todo propertyChange() del adaptador llama al m�todo apropiado del objeto fuente (ChangeReporter).

El BeanBox pone las clases de los adaptadores de eventos en el directorio beans/beanbox/tmp/sunw/beanbox.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
SIGUIENTE ARTÍCULO