Creación de JavaBeans con JBuilder

prev.gif (997 bytes)chapter.gif (1105 bytes)home.gif (1232 bytes)next.gif (1211 bytes)

JavaBeans

Un nuevo proyecto

Añadir un bean al proyecto

Definir una propiedad

La clase cuyos objetos (listeners) están interesados en el cambio en el valor de la propiedad

Vinculación entre la fuente de sucesos y los objetos (listeners) interesados

El código fuente


Una vez que hemos comprendido el funcionamiento básico de los JavaBeans y cómo interactúan entre sí. Vamos a aprovechar el Entorno Integrado de Desarrollo de JBuilder 2.0 para crear una aplicación similar a la estudiada en la página anterior pero sin apenas escribir código.

 

Un nuevo proyecto

Se selecciona File/New project y se escribe el nombre del proyecto, en este caso beanJB en el diálogo Project Wizard. Opcionalmente, se puede escribir la información relativa al título del bean, el autor, la empresa y una breve descripción del bean.

project.gif (5933 bytes)

 

Añadir un bean al proyecto

Se selecciona File/New y en el diálogo New que aparece, se selecciona el icono JavaBean y se pulsa OK

JavaBean.gif (11533 bytes)

A continuación aparece el diálogo JavaBean Wizard que nos pide el nombre del JavaBean, que lo denominamos Asalariado y a continuación, la clase de la cual deriva, en este caso, la clase base Object la raíz de todas las clases en Java.

wizard.gif (5871 bytes)

Observamos el código generado. La clase Asalariado deriva implícitamente de Object y tiene un constructor por defecto (sin parámetros)

package beanJB;

import java.beans.*;

public class Asalariado {
  public Asalariado() {
  }
}

 

Definir una propiedad

Al seleccionar en la parte inferior del IDE la pestaña Bean (al lado de las pestañas Source y Design y Doc), aparece otro grupo de pestañas. Se pulsa con el puntero del ratón sobre la pestaña  Properties y a continuación, se pulsa en el botón Add Property, apareciendo el diálogo New Property

property.gif (6669 bytes)

En el primer control de edición, se introduce el nombre de la propiedad, sueldo. En el segundo, el tipo (String por defecto), borramos String y ponemos int. Las casillas indican que se generarán dos métodos para acceder a esta propiedad uno que empieza por set y el otro por get. Finalmente, se selecciona bound (ligada) como característica de la propiedad sueldo. La parte inferior del diálogo no la modificamos.

Se pulsa el botón OK y se genera nuevo código. Solamente, precisamos inicializar el miembro dato sueldo en el constructor. Por defecto, la variable sueldo toma el valor cero.

package beanJB;

import java.beans.*;

public class Asalariado {
  private int sueldo;
  private transient PropertyChangeSupport propertyChangeListeners = 
	new PropertyChangeSupport(this);

  public Asalariado() {
     sueldo=20;
  }

  public int getSueldo() {
    return sueldo;
  }
  public void setSueldo(int newSueldo) {
    int  oldSueldo = sueldo;
    sueldo = newSueldo;
    propertyChangeListeners.firePropertyChange("sueldo", new Integer(oldSueldo), new Integer(newSueldo));
  }

  public synchronized void removePropertyChangeListener(PropertyChangeListener l) {
    propertyChangeListeners.removePropertyChangeListener(l);
  }
  public synchronized void addPropertyChangeListener(PropertyChangeListener l) {
    propertyChangeListeners.addPropertyChangeListener(l);
  }
}

En la definición de la clase Asalariado en vez de un vector que guarda los objetos (listeners) interesados en el cambio de la propiedad ligada, aparece un objeto denominado propertyChangeListeners de la clase PropertyChangeSupport.

Se generan también las funciones que añaden addPropertyChangeListener o eliminan removePropertyChangeListener objetos de dicha lista.

Cuando se produce un cambio en la propiedad sueldo, se llama a la función setSueldo. En el cuerpo de dicha función, los objetos (listeners) interesados en ser notificados, llaman a la función firePropertyChange, pasándole la información relativa al suceso: el nombre de la propiedad, el valor previo de la propiedad (oldSueldo), el nuevo valor de la propiedad (newSueldo).

El nombre del interface es PropertyChangeListener y no precisa definición, ya que está dentro del paquete java.beans.*

Una vez que hemos cerrado el diálogo New Property que define la propiedad, el contendio del panel Properties es el siguiente.

addProperty.gif (12891 bytes)

 

La clase cuyos objetos (listeners) están interesados en el cambio en el valor de la propiedad

Se añade un nuevo bean al proyecto denominado Hacienda, siguiendo los mismos pasos que para crear Asalariado.

Se selecciona File/New y a continuación en el diálogo New se selecciona el icono JavaBean. En el diálogo titulado JavaBean Wizard se introduce el nombre del bean Hacienda y la clase de la cual deriva, la clase base Object.

Se genera el siguiente código

package beanJB;
public class Hacienda {

  public Hacienda() {
  }
}

Ahora seleccionamos la pestaña Bean y continuación la pestaña Events. Aparecen dos listas, la izquierda se titula Fire these types of events, y la derecha Listen for these events. La objetos (listeners) de la clase Hacienda están interesados en escuchar (listen) los sucesos (events) que emite (fire) los objetos de la clase Asalariado, luego iremos al panel de la derecha. El suceso es personalizado, Custom event, y resulta de un cambio en el valor de una propiedad PropertyChange. Por tanto, activamos esta casilla tal como se ve en la figura inferior

events.gif (16076 bytes)

Si no aparezcen los CustomEvents en la parte superior de los panels Events tal como se muestra en la figura, se pulsa el botón titulado Import Event Set y en el diálogo que aparece titulado Import Event Set, se introduce java.beans.PropertyChangeListener, tal como aparece en la figura inferior, y se pulsa el botón titulado OK para cerrar el diálogo.

eventset.gif (5797 bytes)

A continuación, se pulsa la casilla del panel de la derecha Listen for these events titulada PropertyChange.

Al seleccionar la pestaña Source vemos que se ha generado el código siguiente.

package beanJB;
import java.beans.*;
public class Hacienda implements PropertyChangeListener {

  public Hacienda() {
  }

  public void propertyChange(PropertyChangeEvent e) {
  }
}

El programador solamente tiene que preocuparse por gestionar la información que le proporciona el suceso e de la clase PropertyChangeEvent, en el cuerpo de la función miembro propertyChange.

Como ya se ha mencionado, dicho suceso proporciona tres datos: el nombre de la propiedad, el valor previo y el nuevo valor, que se obtienen mediante las siguientes funciones miembro: getPropertyName, getNewValue, getOldValue. Nos limitaremos de momento, a mostrar estos tres valores.

El código completo de la clase Hacienda es el siguiente

package beanJB;
import java.beans.*;

public class Hacienda implements PropertyChangeListener {

  public Hacienda() {
  }

  public void propertyChange(PropertyChangeEvent e) {
    System.out.println("Hacienda "+e.getPropertyName()+" nuevo:    "+e.getNewValue());
    System.out.println("Hacienda "+e.getPropertyName()+" anterior: "+e.getOldValue());
  }
}

 

Vinculación entre la fuente de sucesos y los objetos (listeners) interesados

Para probar las clases Asalariado y Hacienda y comprobar como un objeto de la primera clase notifica el cambio en una de sus propiedades a un objeto de la segunda clase, creamos la aplicación EjemploApp similar a la estudiada en la página anterior.

En dicha aplicación, se crean dos objetos uno por cada una de las clases, llamando a su constructor por defecto o explícito según se requiera.

    Hacienda funcionario1=new Hacienda();
    Asalariado empleado=new Asalariado();

La vinculación entre el objeto fuente, empleado, y el objeto funcionario1 interesado en conocer el cambio en el valor de su propiedad Sueldo, se realiza mediante la siguiente sentencia.

    empleado.addPropertyChangeListener(funcionario1); 

Cuando escribimos la sentencia

    empleado.setSueldo(50);
  1. El objeto empleado llama a la función setSueldo que cambia la propiedad.
  1. En el cuerpo de setSueldo, cada uno de los objetos (listeners) interesados en el cambio en el valor de la propiedad ligada, llama a firePropertyChange, y le pasa la información relativa al suceso (event) generado: el nombre de la propiedad, el valor previo, y el nuevo valor.
  1. Se llama a la función miembro propertyChange miembro de la clase que implementa el interface PropertyChangeListener cuyos objetos (listeners) están interesados en el cambio en el valor de la propiedad .
  1. En el cuerpo de la función propertyChange, se realizan las tareas relativas al tratamiento de la información que se le proporciona a través del suceso e de la clase PropertyChangeEvent.

 

El código fuente

disco.gif (1035 bytes)Asalariado.java, Hacienda.java, EjemploApp.java