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.
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.
Se selecciona File/New y en el diálogo New que aparece, se selecciona el icono JavaBean y se pulsa OK
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.
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() { } }
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
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.
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
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.
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()); } } |
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);
Asalariado.java, Hacienda.java, EjemploApp.java