Você está na página 1de 43

TutorJava recomienda...

Beans (Bsico) Autor-Traductor: Juan Antonio Palos (Ozito) Puedes encontrar la Version Original en Ingles en ( http://java.sun.com)
Leer comentarios (0)
|

Escribir comentario

Puntuacin:

(1 voto)

Vota

Indice de contenidos q JavaBeans, Componentes en la Plataforma Java


q q q q

Documentacin Adicional Conceptos Sobre los JavaBeans


r

Contenido del BDK Utilizar BeanBox Arrancar y Utilizar BeanBox Aadir un Bean a ToolBox r Arrastrar un Bean al BeanBox r Editar las Propiedades de un Bean r Guardar y Restaurar Beans Los Mens de BeanBox
r

q q q

Utilizar BeanBox para Generar Applets Escribir un Bean Sencillo Makefiles de SimpleBean r Inspeccionar las Propiedades y Eventos de SimpleBean r Generar un Informe de Introspeccin del Bean Propiedades Sencillas
r

Aadir la propiedad Color a SimpleBean Propiedades Compartidas


r

Implementar Propiedades Compartidas dentro de un Bean r Implementar Oyentes de Propiedades Compartida r Propiedades Compartida en el BeanBox Propiedades Restringidas
r

Implementar Propiedades Restringidas dentro de un Bean. r Implementar Oyentes de Propiedades Restringidas r Propiedades Restringidas en el BeanBox r Patrn Para Propiedades Restringidas Propiedades Indexadas
r

Editores de Propiedades Indexadas Manipular Eventos en el BeanBox


r r

r r r

Cmo descubre el BeanBox las capacidades de Eventos de un Beans s Utilizar la Introspeccin para Descubrir los Eventos Lanzados por un Bean s Utilizar BeanInfo para Definir los Eventos Lanzados por el Bean s Ver los Eventos de un Bean en el BeanBox Capturando Eventos en el BeanBox Clases Adaptadoras de Eventos El Bean EventMonitor

r Eventos para Propiedades Compartidas y Restringidas El Interface BeanInfo

Descriptores de Caracterisitcas r Crear una Clase BeanInfo r Utilizar BeanInfo para Controlar las Caractersticas a Exponer r Localizar las clases BeanInfo Personalizacin de Beans
r

Editores de Propiedades r Como se Asocian los Editores de Propiedades con las Propiedades s Los Editores de Propiedades del BDK r Personalizadores s Personalizadores del BDK Persistencia de un Bean
r

Controlar la Serializacin r Serializacin por Defecto: El Interface Serializable r Serializacin Selectiva Utilizando el Modificador transient r Serializacin Selectiva: writeObject y readObject() s Ejemplo: el Bean Molecule r El Interface Externalizable s Ejemplo: Los Beans BlueButton y OrangeButton Nuevas Caractersticas de JavaBeans
r
|

Leer comentarios (0)

Escribir comentario

Puntuacin:

(1 voto)

Vota

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

JavaBeans, Componentes en la Plataforma Java


r

Documentacin Adicional

JavaBeans, Componentes en la Plataforma Java


Los JavaBeans traen la tecnologa de componentes a la Plataforma Java. Se puede utilizar el API JavaBeans para escribir clases Java, conocidas como Beans, que se pueden manipular visualmente con herramientas visuales. JavaBeans es una capacidad del JDK1.1. Cualquier navegador o herramienta que soporte JDK1.1 soporta implcitamente los JavaBeans. Este documento es una gua de mano para conocer los JavaBeans y el Kit de Desarrollo de Beans (BDK). La Especificacin del API JavaBeans proporciona una descripcin completa de los JavaBeans. Imprime una copia de esta especificacin, y mantenla cerca mientras lees este documento. El software que se necesita para aprender sobre los JavaBeans est disponible en la web. Adems del Kit de Desarrollo de Beans (BDK), necesitaremos el Java Development Kit (JDK). Conceptos sobre los JavaBeans y el BDK describe lo que hace un Bean, y que es BDK. Utilizar el BeanBox describe las operaciones bsicas de BeanBox, y explica sus mens. Escribir un Bean Sencillo ensea como crear un Bean rudimentario, como guardarlo, como aadirlo a ToolBox situando el Bean dentro de BeanBox, como inspecionar las propiedades y los eventos del Bean, y como generar un informe de introspeccin de un Bean. Propiedades explica cmo dar propiedades a los Beans: Las caractersticas de apariencia y comportamiento del Bean personalizables durante el diseo. Manipular Eventos en el BeanBox describe las capacidades de manipulacin de eventos del BeanBox. Si no ests familiarizado con el manejo de eventos deberas leer Mecanismo de eventos del JDK 1.1 para preparar este material. El interface BeanInfo describe como escribir clases de informacin de Beans: Separa las clases que se pueden utilizar explcitamente avisando de las propiedades, los mtodos y los eventos del Bean a la herramienta visual. Personalizar Beans presenta las propiedades de editor, y el interface Customizer . Persistencia de un Bean explica como guardar y restaurar nuestros Beans, y sus estados personalizados. Nuevas Caractersitcas describe el Marco de Trabajo "Java Activation", BeanContext, y el "drag and drop" nativo.

Documentacin Adicional
El directorio beans/docs del BDK contiene esta informacin.
q q q q q q

El API Beans El API BeanBox Beans de ejemplo El API java.util Ficheros (JAR) y sus manifiestos Makefiles para gnumake (Unix) y nmake (Windows)

Un buen punto de entrada es el fichero beans/README.html. La pgina Documentacin JavaBeans contiene las definiciones actuales del API JavaBeans, incluyendo las descripciones de las caractersticas de los JavaBeans, y documentacin relacionada como el API Reflection, Serializacin del Objetos, Invocacin de Mtodos Remotos (RMI), y una lista de libros de JavaBeans de terceras partes.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Conceptos Sobre los JavaBeans

Conceptos Sobre los JavaBeans


El API JavaBeans permite escribir componentes software en Java. Los componentes son unidades software reutilizables y auto-contenidas que pueden ser unirse visualmente en componentes compuestos, applets, aplicaciones y servlets utilizando herramientas visuales de desarrollo de aplicaciones. Los componentes JavaBean son conocidos como Beans. Una herramienta de desarrollo que soporte JavaBeans, mantiene los Beans en un paleta o caja de herramientas. Se puede seleccionar un Bean de la paleta, arrastarlo dentro de un formulario, modificar su apariencia y su comportamiento, definir su interaccin con otros Beans, y componer un applet, una aplicacin, o un nuevo Bean, junto con otros Beans. Todo esto se puede hacer sin escribir una lnea de cdigo. La siguiente lista describe brevemente los conceptos clave de los Beans.
q

Las herramientas de desarrollo descubren las caractersticas de un Bean (esto es, sus propiedades, sus mtodos y sus eventos) mediante un proceso conocido como introspeccin. Los Beans soportan la introspeccin de dos formas. r Adheriendose a las convenciones especficas de nombres conocidas como patrones de nombrado, cuando se nombran las caractersitcas del Bean. La clase java.beans.Introspector examina el Bean buscando esos patrones de diseo para descubrir las caractersiticas del Bean. La clase Introspector se encuentra en el API core reflection.
r

Proporcionando explcitamente informacin sobre la propiedad, el mtodo o el evento con una clase Bean Information relacionada. Esta clase implementa el interface BeanInfo. Una clase BeanInfo lista explcitamente aquellas caractersticas del Bean que estn expuestas a la herramienta de desarrollo.

Puedes ver el captulo 8 de Especificaciones del API JavaBeans para una explicacin sobre la introspeccin, los patrones de diseo y BeanInfo.
q

Propiedades Son las caractersitcas de apariencia y comportamiento de un Bean que pueden ser modificadas durante el diseo. Las propiedades se exponen a las herramientas de desarrollo mediante los patrones de diseo o una clase BeanInfo. Puedes ver el captulo 7 de la Especificacin del API JavaBeans para una completa explicacin. Los Beans exponen sus propiedades para poder ser personalizados durante el diseo. La personalizacin se soporta de dos formas: utilizando editores de propiedades, o utilizando personalizadores de Beans ms sofisticados. Puedes ver el captulo 9 de la Especificacin del API JavaBeans para una explicacin completa. Los Beans utilizan los eventos para comunicarse con otros Beans. Un Bean que quiere recibir eventos (un Bean oyente) registra su inters con un Bean que lanza eventos (un Bean fuente). Las herramientas de desarrollo pueden examinar un Bean para determinar que eventos puede disparar (enviar) y cuales puede manejar (recibir). Puedes ver el Captulo 6 de la Especificacin del API JavaBeans para una explicacin completa. La Persistencia permite a los Beans guardar su estado, y restaurarlo posteriormente. Una vez que se han cambiado las propiedades de Bean, se puede guardar su estado y restaurar el Bean posteriormente. Los JavaBeans utilizan la Serializacin de Objetos Java para soportar la Persistencia. Puedes ver el captulo 5 de la Especificacin del API JavaBeans para una explicacin completa. Los mtodos de un Bean no son diferentes de los mtodos Java, y pueden ser llamados desde otros Beans o desde un entorno de scripts. Por defecto, todos los mtodos pblicos son exportados.

Aunque los Beans han sido diseados para ser entendidos por herramientas de desarrollo, todas las claves del API, incluyendo el soporte para eventos, las propiedades y la persistencia, han sido diseadas para ser fcilmente entendibles por los programadores humanos.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Contenido del BDK

Contenido del BDK


Aqu tienes una descripcin general de los ficheros y directorios del BDK.
q q q

README.html Contiene un punto de entrada a la documentacin del BDK. LICENSE.html Contiene las condiciones de licencia de BDK. GNUmakefile y Makefile son ficheros Make Unix y Windows (.gmk and .mk suffixes) para construir los demos y el BeanBox y para ejecutar el BeanBox beans/apis contiene r java un directorio que contiene ficheros fuentes de JavaBeans. r sun un directorio que contiene ficheros fuente del editor de propiedades. beans/beanbox contiene r makefiles para construir el BeanBox r scripts para ejecutar BeanBox r classes un directorio que contiene las clase de BeanBox r lib un directorio que contiene fichero Jar de soporte de BeanBox utilzado por MakeApplet para producir cdigo. r sun y sunw directorios que contienen los ficheros fuente de BeanBox. r tmp un directorio que contiene ficheros de clases generados automticamente, y ficheros de applets generados automticamente por MakeApplet. beans/demos contiene r makefiles para construir los Beans de ejemplo r un directorio html que contiene demostraciones de los appletrs que deben ser ejecutadas en appletviewer, HotJava, o navegadores que soporten JDK1.. r sunw un directorio que contiene s wrapper un directorio que contiene un Bean de un applet s demos un directorio que contiene los ficheros fuentes de las demos beans/doc contiene r documentacin de las demos r un directorio javadoc que contiene JavaBeans y clases relacionadas y un interface de documentacin. r documentacin miscelanea. beans/jars contiene ficheros Jar para los Beans de ejemplo.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Utilizar BeanBox

Utilizar BeanBox
El BeanBox es un contendor de Beans. Se pueden escribir Beans, luego arrastrarlos dentro de BeanBox para ver si funcionan como se esperaba. El BeanBox tambin sirve como una desmostracin de cmo deben comportarse las herramientas de desarrollo compatibles con los JavaBeans. El BeanBox tambin es una buena herramienta para aprender sobre los Beans. En esta seccin aprenders como utilizar BeanBox. Arrancar y Utilizar BeanBox explica como arrancar BeanBox, y describe la caja de herramientas y la hoja de propiedades. Los Mens de BeanBox explica cada uno de los tems de los mens de BeanBox. Utilizar BeanBox para Generar Applets demuestra la facilidad de BeanBox para generar applets.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Arrancar y Utilizar BeanBox


r r r r

Aadir un Bean a ToolBox Arrastrar un Bean al BeanBox Editar las Propiedades de un Bean Guardar y Restaurar Beans

Arrancar y Utilizar BeanBox


El directorio beans/beanbox contiene scripts para Windows (run.bat) y Unix (run.sh) que arrancan BeanBox. Se pueden utilizar estos comandos para arrancarlo o utilizar:

gnumake run
o:

nmake run
Puedes ver los ficheros del BDK beans/doc/makefiles.html y beans/doc/gnu.txt para informacin sobre cmo obtener copias de estas herramientas. Cuando se arranca, el BeanBox muestra tres ventanas: BeanBox, ToolBox, y la Hoja de Propiedades. Aqu puedes ver su aspecto.

El ToolBox contiene los Beans disponibles para utilizar con el BeanBox. Se pueden aadir Beans al ToolBox. El BeanBox es el rea de trabajo; se seleccionan los Beans de ToolBox y se arrastran hacia el BeanBox para poder trabajar sobre ellos. La hoja de propiedades muestra las propiedades del Bean seleccionado actualmente dentro del BeanBox. La ilustracin muestra el Bean Juggler dentro del BeanBox. El recuadro alrededor del Bean significa que est seleccionado. Se selecciona pulsando sobre el Bean dentro del BeanBox. La hoja de propiedades muestra las propiedades de Juggler.

Aadir un Bean a ToolBox


Cuando BeanBox arranca, carga automticamente el ToolBox con los Beans que encuentre dentro de los ficheros JAR contenidos en el directoriobeans/jars. Mover los ficheros JAR a este directoria hace que sean cargados automticamente cuando arranca BeanBox. Se pueden cargar los Beans desde ficheros JAR localizados en cualquier directorio utilizando el mnu File|LoadJar... de BeanBox.

Arrastrar un Bean al BeanBox


Pulsar sobre el nombre de un Bean dentro de ToolBox lo elige para situarlo dentro del BeanBox. Para arrastar un ejemplar de JellyBean al BeanBox.

1. Pulsa sobre la palabra JellyBean en ToolBox. El cursor cambia a un cruce de ejes. 2. Pulsa dentro de BeanBox. El JellyBean aparecer y ser seleccionado.
Observa el cambio en la hoja de propiedades cuando pongas JellyBean en el BeanBox. Antes de situar JellyBean en el BeanBox, se mostraba la hoja de propiedades de BeanBox; despus de situarlo, se mostrar la hoja de propiedades de JellyBean. Si no has visto el cambio, pulsa dentro del BeanBox, fuera de JellyBean. Esto seleccionar el BeanBox en vex de JellyBean. La hoja de propiedades mostrar entonces las propiedades del BeanBox. Despus de arrastrar un ejemplar de JellyBean al BeanBox, la hoja de propiedades mostrar las propiedades de JellyBean: color, foreground, priceInCents, background, y font.

Editar las Propiedades de un Bean


La hoja de propiedades muestra cada nombre de propiedad y su valor actual. Los valores se muestran en campos de texto editables (Strings y nmeros), mens chocie (Booleanos) o como valores de dibujo (Colores y Fuentes). Cada propiedad tiene un editor de propiedad asociado. Pulsar sobre una propiedad en la hoja de propiedades activa el editor de esa propiedad. Las propiedades mostradas en campos de texto o mens choice se editan dentro de la hoja de propiedades. Como editar sus valores necesita unos interfaces de usuario ms sofsticados, los colores y las fuentes utilizan un editor de propiedades personalizado. Cuando se pulsa sobre una propiedad de color o de fuente se lanza un panel separado para editarlo. Intenta pulsar en todas las propiedades de JellyBean.

Guardar y Restaurar Beans


El BeanBox utiliza Serializacin de Objetos Java para grabar y restaurar Beans y sus estados. Los siguientes pasos demuestran como grabar y restaurar un Bean.

1. Arrastra un JellyBean al BeanBox. 2. Cambia la propiedad color al color que quieras. 3. Selecciona el men File|Save de BeanBox. Aparecer un navegador de ficheros, utilizala para grabar el Bean en un fichero. 4. Selecciona el men File|Clear de BeanBox. 5. Selecciona el men File|Load de BeanBox. Aparecer de nuevo el navegador de ficheros; utilizalo para recuperar el Bean serializado.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Los Mens de BeanBox

Los Mens de BeanBox


Esta pgina explica cada uno de los tems de los mens de BeanBox File, Edit y View.
q

Men File r Save Guarda los Beans que hay en el BeanBox, incluyen la posicin, el tamao y el estado interno de cada Bean. El fichero guardado puede ser cargado mediante File|Load. r SerializeComponent... Guarda los Beans que hay en el BeanBox en un fichero serializado (.ser). Este fichero debe ponerse en un fichero .jar para ser utilizable. r MakeApplet... Genera un applet a partir del contenido del BeanBox. r Load... Carga ficheros guardados en el BeanBox. No cargar ficheros .ser . r LoadJar... Carga el contenido de ficheros JAR en el ToolBox. r Print Imprime el contenido del BeanBox. r Clear Elimina el contenido del BeanBox. r Exit Sale de BeanBox sin ofrecer el guardado de los Beans. Men Edit r Cut Elimina el Bean seleccionado en el BeanBox. El Bean cortado es serializado, y puede ser pegado. r Copy Copia el Bean Seleccionado en el BeanBox. El Bean copiado es serializado y puede ser pegado. r Paste Pega el ltimo Bean cortado o copiado en el BeanBox. r Report... Genera un informe de introspeccin sobre el Bean seleccionado. r Events Lista los eventos disparados por el Bean seleccionado, agrupados por interfaces. r Bind property... Lista todos los mtodos de propiedades encontrados en el Bean seleccionado. MenView r Disable Design Mode Elimina de la pantalla las ventanas del ToolBox y la hoja de propiedades. Elimina todo el comportamiento de diseo y prueba del BeanBox (los beans seleccionados) y los convierte en una aplicacin. r Hide Invisible Beans

Oculta los Beans invisibles.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Utilizar BeanBox para Generar Applets

Utilizar BeanBox para Generar Applets


Se puede utilizar la opcin File|MakeApplet... del men del BeanBox para generar un applet a partir de los contenidos del BeanBox. Al hacer esto se crea.
q q q q

Un fichero JAR que contiene los ficheros de clases y los datos serializados. Un fichero de prueba HTML que utiliza el fichero JAR (y cualquier otro fichero JAR necesario). Un subdirectorio con los ficheros fuente Java y Makefile. Un fichero readme con informacin completa sobre el applet generado y los ficheros involucrados.

Seguiremos estos pasos para generar un applet desde BeanBox.

1. Utilizaremos el ejemplo "Juggler" que creamos en la pgina eventos.


Si hemos guardado el ejemplo en un fichero, lo cargaremos en el BeanBox utilizando el men File|Load. Si ni lo grabamos, seguiremos los pasos de la pgina de eventos para construir el ejemplo. El applet generado tiene el mismo tamao que el marco del BeanBox, por lo tanto deberamos ajustar el tamao del BeanBox al tamao que queramos para el applet.

2. Elegimos File|Make Applet para disparar la ventana de dilogo MakeApplet.

Utilizaremos el nombre para el applet y el fichero JAR por defecto para este ejemplo. Pulsamos el botn OK. Esto es todo. Los ficheros generados se han situado en el directorio beanbox/tmp/myApplet. Se puede inspeccionar nuestro trabajo llamando al appletviewer de esta forma.

appletviewer <BDKInstallation>/beanbox/tmp/myApplet.html.
Esto es lo que vers.

No olvides echar un vistazo al fichero myApplet_readme, y a los otros ficheros generados. Los applets generados pueden utilizarse en cualquier navegador compatible con Java 1.1. El AppletViewer es una buena plataforma de prueba. Otro navegador compatible es el HotJava. La versin beta 3 del IE 4.0 no soporta ficheros JAR, y debers expandir los ficheros JAR y HTML generados. Tambin, un bug en la deserializacin de componentes hace que estos no escuchen los eventos del ratn. Puedes ver el fichero readme necesario para ms informacin. El applet generado no funcionar en Netscape Communicator versiones 4.0 y 4.1.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Escribir un Bean Sencillo


r r r

Makefiles de SimpleBean Inspeccionar las Propiedades y Eventos de SimpleBean Generar un Informe de Introspeccin del Bean

Escribir un Bean Sencillo


En sta pgina aprenderemos algo ms sobre los Beans y BeanBox.
q q q q q q

Creando un Bean sencillo. Compilando y guardando el Bean en un archivo JAR. Cargaando el Bean en el ToolBox Arrastrando un ejemplar del Bean dentro del BeanBox. Inspeccionando las propiedades del Beans, los mtodos y los eventos. Generando un informe de introspeccin.

Nuestro Bean se llamar SimpleBean. Aqu tienes los pasos para crearlo y verlo en el BeanBox.

1. Escribir el cdigo de SimpleBean. Ponerlo en un fichero llamado SimpleBean.java, en cualquier directorio. Aqu tienes el cdigo. import java.awt.*; import java.io.Serializable; public class SimpleBean extends Canvas implements Serializable{ //Constructor sets inherited properties public SimpleBean(){ setSize(60,40); setBackground(Color.red); } }
SimpleBean desciende del componente java.awt.Canvas. Tambin implementa el interface java.io.Serializable, que es requerido por todos los beans. Seleccionar el color del fondo y el tamao del componente es todo lo que hace SimpleBean.

2. Asegurate de que la variable de entorno CLASSPATH apunta a todos ficheros .class (o .jar) necesarios. 3. Compila el Bean: javac SimpleBean.java
Esto produce el fichero de clase SimpleBean.class

4. Crea un fichero de manifiesto. Utiliza tu editor de texto favorito para crear un fichero, que llamaremos manifest.tmp, que contenga el siguiente texto. Name: SimpleBean.class

Java-Bean: True 5. Crea el fichero JAR. Este fichero contendr el manifiesto y el fichero de clase SimpleBean. jar cfm SimpleBean.jar manifest.tmp SimpleBean.class 6. Carga el fichero JAR en el ToolBox. Despliega el men File|LoadJar... Esto traer un navegador de ficheros. Busca la posicin del fichero SimpleBean.jar y seleccionalo. SimpleBean aparecer en la parte inferior del ToolBox. (Observa que cuando arranca el BeanBox, todos los beans que haya en el directorio beans/jars se cargan automticamente en el ToolBox). 7. Arrastra un ejemplar de SimpleBean dentro del BeanBox. Pulsa sobre la palabra SimpleBean en el ToolBox. El cursor cambia a un punto de mira. Mueve el cursor al punto del BeanBox donde quieres situar el Bean y pulsa de nuevo el ratn. SimpleBean aparecer como un rectngulo pintado con un borde marcado. Esto borde significa que est seleccionado. Las propiedades de SimpleBean aparecern en la hoja de propiedades.
Se puede redimensionar el SimpleBean, ya que desciende de Canvas, arrastrando una esquina de la ventana. Veras como el cursor cambia a un ngulo recto cuando pasa sobre una esquina. Tambin se puede reposicionar dentro del BeanBox, arrastando desde cualquier parte del borde que no sea una esquina. Vers que el cursor cambia a una flechas cruzadas cuando pasa por estas posiciones.

Makefiles de SimpleBean
Abajo tienes dos MakeFiles (Unix y Windows) configurados para crear SimpleBean.

# gnumake file CLASSFILES= SimpleBean.class JARFILE= SimpleBean.jar all: $(JARFILE) # Create a JAR file with a suitable manifest. $(JARFILE): $(CLASSFILES) $(DATAFILES) echo "Name: SimpleBean.class" >> manifest.tmp echo "Java-Bean: True" >> manifest.tmp jar cfm $(JARFILE) manifest.tmp *.class @/bin/rm manifest.tmp # Compile the sources %.class: %.java export CLASSPATH; CLASSPATH=. ; \ javac $< # make clean clean. /bin/rm -f *.class /bin/rm -f $(JARFILE)
Aqu tienes la versin Windows de nmake.

# nmake file CLASSFILES= simplebean.class JARFILE= simplebean.jar all: $(JARFILE) # Create a JAR file with a suitable manifest. $(JARFILE): $(CLASSFILES) $(DATAFILES) jar cfm $(JARFILE) << manifest.tmp *.class Name: SimpleBean.class Java-Bean: True

<< .SUFFIXES: .java .class {sunw\demo\simple}.java{sunw\demo\simple}.class . set CLASSPATH=. javac $< clean. -del sunw\demo\simple\*.class -del $(JARFILE)
Se pueden utilizar estos makefiles como plantillas para crear los tuyos propios. Los makefiles de ejemplo, situados en el directorio beans/demo tambin te ensean como utilizar los makefiles para construir y mantener tus Beans.

Inspeccionar las Propiedades y Eventos de SimpleBean


La hoja de propiedades muestra las propiedades del Bean seleccionado. Si seleccionamos SimpleBean, la hoja de propiedades mostrar cuatro propiedades: foreground, background, font, y name. Nosotros no declaramos propiedades en SimpleBean (lo vers ms adelante), por eso estas propiedades son heredadas de Canvas. Pulsando sobre cada propiedad se lanza un editor de propiedad. El BeanBox proporcionar editores por defecto para los tipos primitivos, adems de los tipos Font y Color. Puedes encontrar los fuentes para estos editores de propiedades en beans/apis/sun/beans/editors. Los Beans se comunican unos con otros enviando y recibiendo notificaciones de eventos. Para ver los eventos que SimpleBean puede enviar, elige el men Edit|Events. Se mostrar una lista de eventos agrupados por interfaces. Bajo cada grupo de interface hay una lista de mtodos de evento. Todos estos son heredados de Canvas. Podrs aprender ms sobre propiedades y eventos en prximas secciones.

Generar un Informe de Introspeccin del Bean


La introspeccin es el proceso de descubrir las caractersticas de un Bean en tiempo de diseo por uno de estos dos mtodos.
q q

Reflexin de bajo nivel, que utiliza patrones de diseo para descubrir las caractersticas del Bean. Examinando una clase asociadd de informacin del Bean que describe explcitamente las caractersticas del Bean.

Se puede generar un informe de introspeccin elegiendo el men Edit|Report. El informe lista los eventos, las propiedades y los mtodos del Bean adems de sus caractersticas. Por defecto los informes son enviados a la salida estndard del intrprete Java, que es la ventana donde has arrancado BeanBox. Se puede redireccionar el informe a un fichero cambiando el comando del intrprete Java en beanbox/run.sh o run.bat.

java sun.beanbox.BeanBoxFrame > beanreport.txt

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Propiedades Sencillas
r

Aadir la propiedad Color a SimpleBean

Propiedades Sencillas
Para obtener el mejor resultado de esta seccin, deberas leer primero los captulos 7 y 8, de la Especificacin del API JavaBean. Si creamos una clase Bean, le damos una variable de ejemplar llamada color, y accedemos a color a travs de un mtodo obtnedor llamado getColor y un mtodo seleccionador llamado setColor, entonces hemos creado una propiedad. Las propiedades son aspectos de la apariencia o comportamiento de un Bean que pueden ser modificados en el momento del diseo. Los nombres de los mtodos para obtener o seleccionar propiedades deben seguir unas reglas especficas, llamadas patrones de diseo. Utilizando estos nombres de mtodos basados en patrones de diseo, las herramientas compatibles con JavaBeans (y el BeanBox) pueden.
q q q q q q

Descubrir las propiedades de un Bean. Determinar los atributos de lectura/escritura de las propiedades. Determinar los tipos de propiedades. Localizar un editor apropiado para cada tipo de propiedad. Mostrar las propiedades (normalmente en una hoja de propiedades). Modificar esas propiedades (en tiempo de diseo).

Por ejemplo, una herramienta de construccinm cuando introspeccione nuestro Bean, descubrir dos mtodos.

public Color getColor() { ... } public void setColor(Color c) { ... }


A partir de esto la herramienta puede asegurar que existe una propiedad llamada color, que se puede leer y reescribir, y que su tipo es Color. Adems, la herramienta puede intentar localizar un editor de propiedad para ese tipo, y mostrar la propiedad para que pueda ser editada.

Aadir la propiedad Color a SimpleBean


Haremos los siguientes cambios en SimpleBean.java para aadir la propiedad color.

1. Crear e inicializar una variable de ejemplar privada. private Color color = Color.green; 2. Escribir un mtodo para obtener la propiedad. public Color getColor(){ return color; } 3. Escribir un mtodo para seleccionar la propiedad. public void setColor(Color newColor){ color = newColor;

repaint(); } 4. Sobreescribir el mtodo paint(). Esto es necesario para todas las subclases de Canvas. public void paint(Graphics g) { g.setColor(color); g.fillRect(20, 5, 20, 30); } 5. Compilar el Bean, cargarlo en el ToolBox, y crear un ejemplar en el BeanBox.
Los resultados son:
q q

SimpleBean se mostrar con un rectngulo verde centrado. La hoja de propiedades contendr una nueva propiedad Color. El mecanismo de introspeccin tambin buscar un editor para la propiedad color. El editor de la propiedad Color es uno de los editores por defecto suministrados con el BeanBox. Este editor se asigna como editor de la propiedad Color de SimpleBean. Pulsa sobre la propiedad color en la hoja de propiedades para lanzar este editor.

Aqu tienes una ilustracin del BeanBox que muestra el ejemplar revisado de SimpleBean dentro del BeanBox, la nueva propiedad color en la hoja de propiedades de SimpleBean y un editor de la propiedad color. Recuerda, pulsando sobre la propiedad color en la hoja de propiedades se lanzar este editor.

Aqu tenemos el cdigo fuente completo de SimpleBean revisado para la propiedad color.

package sunw.demo.simple; import java.awt.*; import java.io.Serializable; public class SimpleBean extends Canvas implements Serializable{ private Color color = Color.green; //property getter method public Color getColor(){ return color; } //property setter method. Sets new SimpleBean

//color and repaints. public void setColor(Color newColor){ color = newColor; repaint(); } public void paint(Graphics g) { g.setColor(color); g.fillRect(20, 5, 20, 30); } //Constructor sets inherited properties public SimpleBean(){ setSize(60,40); setBackground(Color.red); } }

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Propiedades Compartidas
r r r

Implementar Propiedades Compartidas dentro de un Bean Implementar Oyentes de Propiedades Compartida Propiedades Compartida en el BeanBox

Propiedades Compartidas
Algunas veces cuando cambia una propiedad de un Bean, otros objetos podran querer ser notificados del cambio y tomar alguna accin basndose en ese cambio. Cuando una propiedad compartida cambia, la notificacin del cambio se enva 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 mtodos para aadir 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 aadirse o eliminarse de la lista de oyentes del Bean que contiene la propiedad, y responder al mtodo de notificacin del evento que seala que la propiedad ha cambiado. Implementando el interface PropertyChangeListener el oyente puede ser aadido a la lista mantenida por el Bean de la propiedad compartida, y como implementa el mtodo PropertyChangeListener.propertyChange(), el oyente puede responder a las notificaciones de cambio de la propiedad. La clase PropertyChangeEvent encapsula la informacin 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 mtodo propertyChange(). Las siguientes secciones proporcionan los detalles de la implementacin de propiedades compartidas.

Implementar Propiedades Compartidas dentro de un Bean


Como ya habrs ledo, un Bean que contenga propiedades compartidas deber.
q q

Permitir a sus oyentes registrar o eliminar su inters en recibir eventos de cambio de propiedad. Disparar eventos de cambio de propiedad a los oyentes interesados.

La clase PropertyChangeSupport implementa dos mtodos para aadir y eliminar objetos PropertyChangeListener de una lista de oyentes, e implementa un mtodo 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 mtodos para mantener la lista de oyentes. Como PropertyChangeSupport implementa esto mtodos slo tenemos que envolver las llamadas a los mtodos del objeto soportado. public void addPropertyChangeListener(PropertyChangeListener l) { changes.addPropertyChangeListener(l); } public void removePropertyChangeListener(PropertyChangeListener l) { changes.removePropertyChangeListener(l); }

4. Modificar un mtodo de seleccin 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 parmetros 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 versin del objeto java.lang.Integer. Observa tambin que el evento de cambio de propiedad se dispara despus de que la propiedad haya cambiado. Cuando el BeanBox reconoce el patrn de diseo 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 mtodo.

public abstract void propertyChange(PropertyChangeEvent evt)


El Bean fuente llama a este mtodo de notificacin 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 mtodo propertyChange() en el oyente. Este mtodo necesita contener el cdigo que maneja lo que se necesita hacer cuando el oyente recibe el evento de cambio de propiedad. Por ejemplo, una llamada a un mtodo de seleccin de la clase oyente: un cambio en una propiedad del Bean fuente se propaga a una propiedad del Bean oyente.
Para registrar el inters en recibir notificaciones sobre los cambios en una propiedad de un Bean, el Bean oyente llama al mtodo 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 mtodo 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 tcnica. 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 lnea que aparece al ejemplar de ChangeReporter. Se mostrar el cuadro de dilogo 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.
Detrs de la escena, el BeanBox genera el adaptador de eventos. Este adaptador implementa el interface PropertyChangeListener, y tambin genera una implementacin del mtodo propertyChange() que llama el mtodo ChangeReporter.reportChange(). Aqu tienes el cdigo 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 mtodo propertyChange() del adaptador llama al mtodo apropiado del objeto fuente (ChangeReporter). El BeanBox pone las clases de los adaptadores de eventos en el directorio beans/beanbox/tmp/sunw/beanbox.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Propiedades Restringidas
r r r r

Implementar Propiedades Restringidas dentro de un Bean. Implementar Oyentes de Propiedades Restringidas Propiedades Restringidas en el BeanBox Patrn Para Propiedades Restringidas

Propiedades Restringidas
Una propiedad de un Bean est Restringida cuando cualquier cambio en esa propiedad puede ser vetado, Normalmente es un objeto exterior el que ejerce su derecho a veto, pero el propio Bean puede vetar un cambio en una propiedad. El API de JavaBeans proporciona un mecanismo de eventos similar al mecanismo de las propiedades compartidas, que permite a los objetos vetar los cambios de una propiedad de un Bean. Existen tres partes en la implementacin de una propiedad Restringida.
q q

Un Bean fuente que contiene una o ms propiedades restringidas. Objetos oyentes que implementan el interface VetoableChangeListener . Estos objetos aceptan o rechazan la proposcin de un cambio en la propiedad restringida del Bean fuente. Un objeto PropertyChangeEvent que contiene el nombre de la propiedad, y sus valores nuevo y antiguo. Esta es la misma clase utilizada por las propiedades compartidas.

Implementar Propiedades Restringidas dentro de un Bean.


Un Bean que contenga propiedades restringidas debe.
q

Permitir que objetos VetoableChangeListener registren su inters en recibir notificaciones de proposiciones de cambio de una propiedad. Disparar eventos de cambio de propiedad hacia aquellos oyentes interesados, cuando se proponga un cambio de propiedad. El evento debera ser disparado antes de que el cambio real de la propiedad tenga lugar. El PropertyChangeEvent es disparado por una llamada al mtodo vetoableChange() de todos los oyentes. Si un oyente veta el cambio, debe asegurarse que todos los dems oyentes pueden volver al valor antiguo. Esto significa volver a llamar al mtodo vetoableChange() de todos los oyentes, con un PropertyChangeEvent que contenga el valor antiguo.

La clase VetoableChangeSupport se proporciona para implementar estas capacidades. Esta clase implementa mtodos para aadir y eliminar objetos VetoableChangeListener a una lista de oyentes, y un mtodo que dispara eventos de cambio de propiedad a todos los oyentes de la lista cuando se propone un cambio de propiedad. Este mtodo tambin capturar cualquier veto, y re-enviar el evento de cambio de propiedad con el valor original de la propiedad. Nuestro Bean puede descencer de la clase VetoableChangeSupport, o utilizar un ejemplar de ella. Observa que, en general, las propiedades restringidas tambin deberan ser propiedades compartidas. Cuando ocurre un cambio en una propiedad restringida, puede ser enviado un PropertyChangeEvent mediante PropertyChangeListener.propertyChange() para indicar a todos los Beans VetoableChangeListener que el cambio a tenido efecto. El Bean JellyBean tiene una propiedad restringida. Veremos su cdigo para ilustrar los pasos e implementar propiedades restringidas.

1. Importar el paquete java.beans, esto nos da acceso a la clase VetoableChangeSupport. 2. Ejemplarizar un objeto VetoableChangeSupport dentro de nuestro Bean. private VetoableChangeSupport vetos = new VetoableChangeSupport(this);
VetoableChangeSupport maneja una lista de objetos VetoableChangeListener, y dispara eventos de cambio de propiedad a cada objeto de la lista cuando ocurre un cambio en una propiedad restringida.

3. Implementar mtodos para mantener la lista de oyentes de cambio de propiedad. Esto slo envuelve la llamada a los mtodos del objeto VetoableChangeSupport. public void addVetoableChangeListener(VetoableChangeListener l) { vetos.addVetoableChangeListener(l); } public void removeVetoableChangeListener(VetoableChangeListener l) { vetos.removeVetoableChangeListener(l); } 4. Escribir un mtodo seleccionador de propiedades que dispare un evento de cambio de propiedad cuando la propiedad ha cambiado. Esto incluye aadir una clausula throws a la firma del mtodo. El mtodo setPriceInCents() de JellyBean se parece a esto. public void setPriceInCents(int newPriceInCents) throws PropertyVetoException { int oldPriceInCents = ourPriceInCents; // First tell the vetoers about the change. If anyone objects, we // don't catch the exception but just let if pass on to our caller. vetos.fireVetoableChange("priceInCents", new Integer(oldPriceInCents), new Integer(newPriceInCents)); // No-one vetoed, so go ahead and make the change. ourPriceInCents = newPriceInCents; changes.firePropertyChange("priceInCents", new Integer(oldPriceInCents), new Integer(newPriceInCents)); }
Observa que setPriceInCents() almacena el valor antiguo de price, porque los dos valores, el nuevo y el antiguo, deben ser pasados a fireVetoableChange(). Tambin observa que los precios primitivos int se han convertido a objetos Integer.

public void fireVetoableChange(String propertyName, Object oldValue, Object newValue) throws PropertyVetoException
Estos valores se han empaquetado en un objeto PropertyChangeEvent enviado a cada oyente. Los valores nuevo y antiguo son tratados como valores Object, por eso si son tipos primitivos como int, deben utilizarse sus versiones objetos como java.lang.Integer. Ahora necesitamos implementar un Bean que escuche los cambios en las propiedades restringidas.

Implementar Oyentes de Propiedades Restringidas


Para escuchar los eventos de cambio de propiedad, nuestro Bean oyente debe implementar el interface VetoableChangeListener. El interface contiene un mtodo.

void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException;


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

1. Implementar el interface VetoableChangeListener. 2. Implementar el mtodo vetoableChange(). Este es el mtodo al que llamar el Bean fuente en cada objeto de la lista de oyentes (mantenida por el objeto VetoableChangeSupport). Este tambin es el mtodo que ejerce el poder del veto. Un cambio de propiedad es vetado lanzando una PropertyVetoException.
Observa que el objeto VetoableChangeListener frecuentemente es una clase adaptador. La clase adaptador implementa el interface VetoableChangeListener y el mtodo vetoableChange(). Este adaptador es aadido a la lista de oyentes del Bean restringido, intercepta la llamada a vetoableChange(), y llama al mtodo del Bean fuente que ejerce el poder del veto.

Propiedades Restringidas en el BeanBox


Cuando el BeanBox reconoce el patrn de diseo de una propiedad restringida dentro de un Bean, se ver un tem de un interface vetoableChange al desplegar el men Edit|Events. El BeanBox genera una clase adaptador cuando se conecta un Bean que tiene una propiedad restringida con otro Bean. Para ver como funciona esto, sigue estos pasos.

1. Arrastra ejemplares de Voter y de JellyBean al BeanBox.

2. Selecciona el ejemplar de JellyBean y elige el men Edit|Events|vetoableChange|vetoableChange. 3. Conecta la lnea que aparece con el Bean Voter. Esto mostrar el panel EventTargetDialog. 4. Elige el mtodo vetoableChange del Bean Voter, y pulsa sobre el botn OK. Esto genera un adaptador de eventos que puedes ver en el directorio beans/beanbox/tmp/sunw/beanbox. 5. Prueba la propiedad restringida. Selecciona el JellyBean y edita sus propiedades priceInCents en la hoja de propiedades. Se lanzar una PropertyVetoException, y se mostrar un dialogo de error.
Detrs de la escena el BeanBox genera el adaptador de evento. Este adaptador implementa el interface, VetoableChangeListener, y tambin genera un mtodo vetoableChange() que llama al mtodo Voter.vetoableChange(). Aqu tienes el cdigo generado para el adaptador.

// Automatically generated event hookup file. package tmp.sunw.beanbox; import sunw.demo.misc.Voter; import java.beans.VetoableChangeListener; import java.beans.PropertyChangeEvent; public class ___Hookup_1475dd3cb5 implements java.beans.VetoableChangeListener, java.io.Serializable { public void setTarget(sunw.demo.misc.Voter t) { target = t; } public void vetoableChange(java.beans.PropertyChangeEvent arg0) throws java.beans.PropertyVeto Exception { target.vetoableChange(arg0); } private sunw.demo.misc.Voter target; }
El Bean Voter no necesita implementar el interface VetoableChangeListener; en su lugar, la clase adaptador generada implementa VetoableChangeListener. El mtodo vetoableChange() del adaptador llama al mtodo apropiado en el objeto fuente (Voter).

Patrn Para Propiedades Restringidas


Al igual que las propiedades compartidas, existe un patrn de diseo soportado para aadir y eliminar objetos VetoableChangeListener que se han unido a un nombre de propiedad especfico.

void addVetoableChangeListener(String propertyName, VetoableChangeListener listener); void removeVetoableChangeListener(String propertyName, VetoableChangeListener listener);
Como alternativa, por cada propiedad restingida de un Bean se pueden proporcionar mtodos con la siguiente firma para registrar y eliminar oyentes de una propiedad bsica.

void add<PropertyName>Listener(VetoableChangeListener p); void remove<PropertyName>Listener(VetoableChangeListener p);

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Propiedades Indexadas
r

Editores de Propiedades Indexadas

Propiedades Indexadas
Las propiedades indexadas reprensentan coleciones de valores a los que se accede por ndices como en los arrays. Los patrones de diseo de las propiedades indexadas son:

//Mtodos para acceder al array de propiedades completo public <PropertyType>[] get<PropertyName>(); public void set<PropertyName>(<PropertyType>[] value); //Mtodos para acceder a valores individuales public <PropertyType> get<PropertyName>(int index); public void set<PropertyName>(int index, <PropertyType> value);
De acuerdo con estos patrones las herramientas de programacin saben que nuestro Bean contiene una propiedad indexada. El Bean OurListBox ilustra como utilizar las propiedades indexadas. OurListBox desciende de la clase List para proporcionar un Bean que presenta al usuario una lista de elecciones: Choices que se puede proporcionar y disear durante el dise. Aqu tienes una ilustracin de un ejemplar de OurListBox .

OurListBox expone el item indexado con los siguientes mtodos accesores.

public void setItems(String[] indexprop) { String[] oldValue=fieldIndexprop; fieldIndexprop=indexprop; populateListBox(); support.firePropertyChange("items",oldValue, indexprop); } public void setItems(int index, String indexprop) { String[] oldValue=fieldIndexprop; fieldIndexprop[index]=indexprop; populateListBox(); support.firePropertyChange("Items",oldValue, fieldIndexprop); } public String[] getItems() { return fieldIndexprop; }

public String getItems(int index) { return getItems()[index]; }


Cuando un item es seleccionado por uno de los mtodos setItems(), OurListBox se puebla con el contenido de un array String. La exposicin de las propiedades indexadas es casi tan fcil como la de las propiedades sencillas. Sin embargo, escribir un editor de propiedades indexadas requiere escribir un editor de propiedades personalizado.

Editores de Propiedades Indexadas


El Bean OurListBox proporciona un IndexPropertyEditor asociado que es un buen ejemplo de cmo implementar un editor de propiedades indexadas. La siguiente ilustracin muestra un ejemplar de OurListBox en el BeanBox, la hoja de propiedades que contiene una entrada para los items de la propiedad indexada, y el IndexPropertyEditor que sale cuando se pulsa sobre los tems de la propiedad.

Implementar IndexPropertyEditor es lo mismo que implementar cualquier editor de propiedades personalizado.

1. Implementar el interface PropertyEditor. public class IndexPropertyEditor extends Panel implements PropertyEditor, Action Listener {
Se puede utilizar la clase PropertyEditorSupport, utilizando una subclase o como clase interna.

2. Denotar el editor personalizado en una clase BeanInfo relacionada. OurListBox tiene una clase OurListBoxBeanInfo relacionada que contiene el siguiente cdigo. itemsprop.setPropertyEditorClass(IndexPropertyEditor.class); 3. Hacer que el editor de propiedades sea una fuente de eventos compartidos. El editor de propiedades registrar los oyentes de la propiedad y disparar los eventos de cambio de propiedad a esos oyentes. As es como los cambios en la propiedad se propagan hacia el Bean (mediante la hoja de propiedades). Por eso IndexPropertyEditor ejemplariza una clase interna PropertyChangeSupport. private PropertyChangeSupport support = new PropertyChangeSupport(this);
Proporciona la habilidad de que los objetos registren su inters en ser notificados cuando una propiedad es editada.

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


Y dispara un evento de cambio de propiedad a dichos oyentes:

public void actionPerformed(ActionEvent evt) { if (evt.getSource() == addButton) { listBox.addItem(textBox.getText()); textBox.setText(""); support.firePropertyChange("", null, null); } else if (evt.getSource()== textBox) { listBox.addItem(textBox.getText()); textBox.setText(""); support.firePropertyChange("",null,null); } ... }
IndexPropertyEditor mantiene listbox como una copia de OurListBox. Cuando se hace un cambio en listbox, se dispara un evento de cambio de propiedad a todos los oyentes. Cuando una hoja de propiedades, que est registrada como un oyente de IndexPropertyEditor, recibe un evento de cambio de propiedad desde IndexPropertyEditor, llama a IndexPropertyEditor.getValue() para recuperar los tems nuevos o cambiados para actualizar el Bean.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Manipular Eventos en el BeanBox


r

Cmo descubre el BeanBox las capacidades de Eventos de un Beans


s s s

Utilizar la Introspeccin para Descubrir los Eventos Lanzados por un Bean Utilizar BeanInfo para Definir los Eventos Lanzados por el Bean Ver los Eventos de un Bean en el BeanBox

r r r r

Capturando Eventos en el BeanBox Clases Adaptadoras de Eventos El Bean EventMonitor Eventos para Propiedades Compartidas y Restringidas

Manipular Eventos en el BeanBox


Los Beans utilizan el mecanismo de eventos implementado en el JDK 1.1, por eso implementar eventos en los Beans es igual que implementar eventos en cualquier componente del JDK 1.1. Esta seccin describe como se utiliza este mecanismo de eventos en los Beans y en el BeanBox.

Cmo descubre el BeanBox las capacidades de Eventos de un Beans


El BeanBox utiliza la introspeccin de patrones de diseo o una clase BeanInfo para descubir los eventos que puede disparar un Bean.

Utilizar la Introspeccin para Descubrir los Eventos Lanzados por un Bean


Los JavaBeans proporcionan patrones de diseo orientados a eventos para dar a las herramientas de introspeccin la posibilidad de descubir los eventos que puede lanzar un Bean. Para que un Bean sea la fuente de un evento, debe implementar mtodos que aadan y eliminen oyentes para el tipo del objeto. Los patrones de diseo para esos mtodos son

public void add<EventListenerType>(<EventListenerType> a) public void remove<EventListenerType>(<EventListenerType> a)


Estos mtodos le permiten a un Bean fuente saber donde lanzar los eventos. Entonces el Bean fuente lanza los eventos a aquellos Beans oyentes que utilicen los mtodos para aquellos interfaces particulares. Por ejemplo, si un Bean fuente registra objetos ActionListener, lanzar eventos a dichos objetos llamando al mtodo actionPerformed() de dichos oyentes. Para ver los eventos descubiertos utilizando patrones de diseo, arrastra un ejemplar de OurButton dentro del BeanBox y despliega el men Edit|Events. Esto muestra una lista de interface de eventos que OurButton puede disparar. Observa que el propio OurButton slo aade dos de esos interfaces; el resto son heredados de la clase base.

Utilizar BeanInfo para Definir los Eventos Lanzados por el Bean


Se pueden "publicar" explcitamente los eventos lanzados por un Bean, utilizando una clase que implementa el interface BeanInfo. El Bean ExplicitButton subclasifica OurButton, y proporciona una clase ExplicitButtonBeanInfo asociada. ExplicitButtonBeanInfo implementa el siguiente mtodo para definir explcitamente los interfaces que ExplicitButton utiliza para lanzar eventos.

public EventSetDescriptor[] getEventSetDescriptors() { try { EventSetDescriptor push = new EventSetDescriptor(beanClass, "actionPerformed",

java.awt.event.ActionListener.class, "actionPerformed"); EventSetDescriptor changed = new EventSetDescriptor(beanClass, "propertyChange", java.beans.PropertyChangeListener.class, "propertyChange"); push.setDisplayName("button push"); changed.setDisplayName("bound property change"); EventSetDescriptor[] rv = { push, changed}; return rv; } catch (IntrospectionException e) { throw new Error(e.toString()); } }
Arrastra un ejemplar de ExplicitButton al BeanBox, y despliega el men Edit|Events. Observa que slo se listan aquellos interfaces expuestos explcitamente en la clase ExplicitButtonBeanInfo. No se exponen las capacidades heredadas. Puedes ver la pgina El Interface BeanInfo para ms informacin sobre este interface.

Ver los Eventos de un Bean en el BeanBox


Si has seleccionado un Bean OurButton en el BeanBox, despliega el men Edit|Events, vers una lista de interfaces a los que OurButton puede lanzar eventos. Cuando se selecciona algn interface, se muestran los mtodos que lanzan diferentes eventos a dichos interfaces. Estos corresponden a todos los eventos que OurButton puede lanzar.

Capturando Eventos en el BeanBox


En este ejemplo utilizaremos dos ejemplares del Bean OurButton para arrancar y parar un ejemplar del Bean Juggler animado. Etiquetaremos esto botones como "start" y "stop"; haremos que cuando se pulse el botn "start" se llame al mtodo startJuggling del Bean Juggler; y que cuando se pulse el botn "stop", se llame al mtodo stopJuggling del Bean Juggler.

1. 2. 3. 4. 5.

Arranca el BeanBox. Arrastra un Bean Juggler y dos ejemplares de OurButton en el BeanBox. Selecciona un ejemplar de OurButton. En la hoja de propiedades, cambia la etiqueta a "start". Selecciona el segundo ejemplar de OurButton y cambia su etiqueta a "stop". Seleciona el botn start. elige el men Edit|Events|action|actionPerformed. Esto hace que aparezca una linea marcada entre el botn start y el cursor. Pulsar sobre el ejemplar de Juggler. Esto trae el EventTargetDialog.

Esta lista contiene los mtodos de Juggler que no toman argumentos, o argumentos del tipo actionPerformed.

6. Selecciona el mtodo startJuggling y pulsa OK. Vers un mensaje indicando que el BeanBox est

generando una clase adaptador. 7. repite los dos ltimos pasos sobre el botn stop, excepto en elegir el mtodo stopJuggling en el EventTargetDialog.
Si pulsas ahora sobre los botones start y stop se arrancar y parar la ejecucin de Juggler. Aqu tienes una descripcin general de lo que ha sucedido.
q

q q

Los botones start y stop son fuentes de eventos. Las fuentes de eventos lanzan eventos a los destinos de eventos. En este ejemplo el Bean Juggler es el Destino del Evento. Cuando se selecciona el botn start y se elige un mtodo de evento (mediante el men Edit|Event), se est eligiendo el tipo de evento que lanzar la fuente del evento. cuando se conecta la lnea con otro Bean, ests seleccionando el Bean Destino del evento. El EventTargetDialog lista los mtodos que pueden aceptar ese tipo de eventos o que no tomen parmetros. Cuando se elige un mtodo en el EventTargetDialog, se est eligiendo el mtodo que recibir el evento lanzado, y actuar sobre l.

Utiliza el men File|Save par grabar este ejemplo en un fichero de tu eleccin.

Clases Adaptadoras de Eventos


El BeanBox genera una clase adpatador que se interpone entre la fuente y el destino del evento. La clase adaptador implementa el interface del oyente de evento apropiado (como el oyente real), captura el evento lanzado por el botn, y llama al mtodo seleccionado del bean destino. Aqu tienes la clase adpatador generada por el BeanBox que se interpone entre el botn start y el JugglerBean.

// Automatically generated event hookup file. package tmp.sunw.beanbox; import sunw.demo.juggler.Juggler; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class ___Hookup_1474c0159e implements java.awt.event.ActionListener, java.io.Serializable { public void setTarget(sunw.demo.juggler.Juggler t) { target = t; } public void actionPerformed(java.awt.event.ActionEvent arg0) { target.startJuggling(arg0); } private sunw.demo.juggler.Juggler target; }
El adaptador implementa el interface ActionListener que se ha seleccionado en el men Edit|Events del BeanBox. ActionListener declare un mtodo, actionPerformed(), que es implementado por el adaptador para llamar al mtodo del Bean destino (startJuggling()) que se ha seleccionado. El mtodo setTarget() del adaptador es llamado por el BeanBox para seleccionar el Bean destino real, en este caso Juggler.

El Bean EventMonitor
El Bean EventMonitor (beans/demo/sunw/demo/encapsulatedEvents) imprime informes de los eventos del Bean fuente, en un listbox. Para ver como funciona esto, sigue estos pasos.

1. Arrastra ejemplares de OurButton y EventMonitor hasta el BeanBox. Podras redimensionar el EventMonitor (y el BeanBox) para acomodar la visin de los informes de eventos. 2. Selecciona el ejemplar de OurButton, y elige cualquier mtodo en el men Edit|Events. 3. Conecta la lnea que aparece con el EventMonitor, y elige su initiateEventSourcMonitoring en el EventTargetDialog. 4. Selecciona el Bean OurButton. Estars viendo un informe de eventos en el EventMonitor
Cuando el primer evento es enviado, EventMonitor analiza el Bean fuente para descubrir todos los eventos que lanza, crea y registra oyentes de eventos para cada tipo de evento, y luego informa siempre que se lance un evento. Esto es til para depuracin, Intenta conectar otros Beans a EventMonitor para observar sus eventos.

Eventos para Propiedades Compartidas y Restringidas


Las pginas sobre propiedades Compartidas y Restringidas describen dos interfaces de oyentes de eventos especficos.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

El Interface BeanInfo
r r r r

Descriptores de Caracterisitcas Crear una Clase BeanInfo Utilizar BeanInfo para Controlar las Caractersticas a Exponer Localizar las clases BeanInfo

El Interface BeanInfo
Clo examinan las herramientas de desarrollo a un Bean para exponer sus caractersitcas (propiedades, eventos y mtodos) en un hoja de propiedades? Utilizando la clase java.beans.Introspector. Esta clase utiliza el corazn de reflexin del API del JDK para descubrir los mtodos del Bean, y luego aplica los patrones de diseo de los JavaBeans para descubrir sus caractersitcas. Este proceso de descubrimiento se llama introspeccin. De forma alternativa, se pueden exponer explcitamente las caractericas del Bean en una clase asociada separada que implemente el interface BeanInfo. Asociando una clase BeanInfo con un Bean se puede.
q q

q q q q

Exponer solo aquellas caractersticas que queremos exponer. Relegar en BeanInfo la exposicin de algunas caractersitcas del Bean, mientras se deja el resto para la reflexin de bajo nivel. Asociar un icono con el Bean fuente. Especificar una clase personaliza. Segregar las caractersitcas entre normales y expertas. Proporcionar un nombre ms descriptivo, informacin adicional sobre la caractersitca del Bean.

BeanInfo define mtodos que devuelven descriptores para cada propiedad, mtodo o evento que se quiere exponer. Aqu tienes los prototipos de estos mtodos.

PropertyDescriptor[] getPropertyDescriptors(); MethodDescriptor[] getMethodDescriptors(); EventSetDescriptor[] getEventSetDescriptors();


Cada uno de estos mtodos devuelve un array de descriptores para cada caractersitca.

Descriptores de Caracterisitcas
Las clases BeanInfo contienen descriptores que precisamente describen las caractersticas del Bean fuente. El BDK implementa las siguientes clases.
q

q q

q q q

FeatureDescriptor es la clase base para las otras clases de descriptores. Declara los aspectos comunes a todos los tipos de descriptores. BeanDescriptor describe el tipo de la clase y el nombre del Bean fuente y describe la clase personalizada del Bean fuente si existe. PropertyDescriptor describe las propiedades del Bean fuente. IndexedPropertyDescriptor es una subclase de PropertyDescriptor, y describe las propiedades indexadas del Bean fuente. EventSetDescriptor describe los eventos lanzados por el Bean fuente. MethodDescriptor describe los mtodos del Bean fuente. ParameterDescriptor describe los parmetros de mtodos.

El interface BeanInfo declara mtodos que devuelven arrays de los descriptores anteriores.

Crear una Clase BeanInfo


Utilizaremos la clase ExplicitButtonBeanInfo para ilustrar la creacin de una clase BeanInfo. Aqu estn los pasos generales para crear una clase BeanInfo.

1. Nombrar la clase BeanInfo. Se debe aadir el estring "BeanInfo" al nombre de la clase fuente. Si el nombre de la clase fuente es ExplicitButton, la clase BeanInfo asociada se debe llamar ExplicitButtonBeanInfo 2. Subclasificar SimpleBeanInfo. Esta es una clase de conveniencia que implementa los mtodos de BeanInfo para que devuelvan null o un valor nulo equivalente.

public class ExplicitButtonBeanInfo extends SimpleBeanInfo {


Utilizando SimpleBeanInfo nos ahorramos tener que implementar todos los mtodos de BeanInfo; solo tenemos que sobreescribir aquellos mtodos que necesitemos.

3. Sobreescribir los mtodos apropiados para devolver las propiedades, los mtodos o los eventos que queremos exponer. ExplicitButtonBeanInfo sobreescribe el mtodo getPropertyDescriptors() para devolver cuatro propiedades. public PropertyDescriptor[] getPropertyDescriptors() { try { PropertyDescriptor background = new PropertyDescriptor("background", beanClass); PropertyDescriptor foreground = new PropertyDescriptor("foreground", beanClass); PropertyDescriptor font = new PropertyDescriptor("font", beanClass); PropertyDescriptor label = new PropertyDescriptor("label", beanClass); background.setBound(true); foreground.setBound(true); font.setBound(true); label.setBound(true); PropertyDescriptor rv[] = {background, foreground, font, label}; return rv; } catch (IntrospectionException e) { throw new Error(e.toString()); } }
Existen dos cosas importantes que observar aqu:

Si se deja fuera algn descriptor, la propiedad, evento o mtodo no descrito no se expondr. En otras palabras, se puede exponer selectivamente las propiedades, eventos o mtodos, dejando fuera las que no queramos exponer. r Si un mtodo obtenedor de caractersticas (por ejemplo getMethodDescriptor()) devuelve Null, se utilizar la reflexin de bajo nivel para esa caractersitca. Esto significa, por ejemplo, que se pueden expecificar explicitamente propiedades, y dejar que la reflexin de bajo nivel descubra los mtodos. Si no se sobreescribe el mtodo por defecto de SimpleBeanInfo que devuelve null, la reflexin de bajo nivel se utilizar para esta caracterstica. 4. Optionalmente, asociar un icono con el Bean fuente.
r

public java.awt.Image getIcon(int iconKind) { if (iconKind == BeanInfo.ICON_MONO_16x16 || iconKind == BeanInfo.ICON_COLOR_16x16 ) { java.awt.Image img = loadImage("ExplicitButtonIcon16.gif"); return img; } if (iconKind == BeanInfo.ICON_MONO_32x32 || iconKind == BeanInfo.ICON_COLOR_32x32 ) { java.awt.Image img = loadImage("ExplicitButtonIcon32.gif"); return img; } return null; }
El BeanBox muestra el icono junto al nombre del Bean en el ToolBox. Se puede esperar que las herramientas de desarrollo hagan algo similar.

5. Especificar la clase del Bean fuente, y , si el Bean est personalizado, especificarlo tambin. public BeanDescriptor getBeanDescriptor() { return new BeanDescriptor(beanClass, customizerClass); } ... private final static Class beanClass = ExplicitButton.class; private final static Class customizerClass = OurButtonCustomizer.class;
Guarda la clase BeanInfo en el mismo directorio que la clase fuente. El BeanBox busca primero la clase BeanInfo de un Bean en el path del paquete del Bean. Si no se encuentra el BeanInfo, entonces la informacin del Bean busca en el path (mantenido por el Introspector). La informacin del Bean se busca por defecto en el path sun.beans.infos. Si no se encuentra la clase BeanInfo, se utiliza la reflexin de bajo nivel para descrubrir las

caractersticas del Bean.

Utilizar BeanInfo para Controlar las Caractersticas a Exponer


Si reparamos en la reflexin del bajo nivel para descubrir las caractersticas del Bean, todas aquellas propiedades, mtodos y eventos que conformen el patrn de diseo apropiado sern expuestas en una herramienta de desarrollo. Esto incluye cualquier caracterstica de la clase base. Si el BeanBox encuentra una clase BeanInfo asociada, entonces la informacin es utiliza en su lugar, y no se examinan ms clases base utilizando la reflexin. En otras palabras, la informacin del BeanInfo sobreescribe la informacin de la reflexin de bajo nivel, y evita el examen de la clase base. Mediante la utilizacin de una clase BeanInfo, se pueden exponer subconjuntos de una caracterstica particular del Bean. Por ejemplo, mediante la no devolucin de un mtodo descriptor para un mtodo particular, ese mtodo no ser expuesto en una herramienta de desarrollo. Cuando se utiliza la clase BeanInfo
q

Las caractersticas de la clase base no sern expuestas. Se pueden recuperar las caractersticas de la clase base utilizando el mtodo BeanInfo.getAdditionalBeanInfo(). Las propiedades, eventos o mtodos que no tengan descriptor no sern expuestos. Para una caracterstica particular, slo aquellos tems devueltos en el array de descriptores sern expuestos. Por ejemplo, si devolvemos descriptores para todos los mtodos de un Bean excepto foo(), entonces foo() no ser expuesto. La reflexin de bajo nivel ser utilizada para las caractersticas cuyos metodos obtenedores devuelvan null. Por ejemplo su nuestra clase BeanInfo contiene esta implementacin de mtodos. public MethodDescriptor[] getMethodDescriptors() { return null; }
Entonces la reflexin de bajo nivel se utilizar para descubrir los mtodos pblicos del Bean.

Localizar las clases BeanInfo


Antes de examinar un Bean, el Introspector intentar encontrar una clase BeanInfo asociada con el bean. Por defecto, el Introspector toma el nombre del paquete del Bean totalmente cualificado, y le aade "BeanInfo" para formar un nuevo nombre de clase. Por ejemplo, si el Bean fuente es sunw.demo.buttons.ExplicitButton, el Introspector intentar localizar sunw.demo.buttons.ExplicitButtonBeanInfo. Si esto falla, se buscar en todos los paquetes en el path de BeanInfo. El path de bsqueda de BeanInfo es mantenido por Introspector.setBeanInfoSearchPath() y Introspector.getBeanInfoSearchPath().

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Personalizacin de Beans
r r

Editores de Propiedades Como se Asocian los Editores de Propiedades con las Propiedades
s

Los Editores de Propiedades del BDK Personalizadores del BDK

Personalizadores
s

Personalizacin de Beans
La apariencia y el comportamiento de un Bean pueden ser personalizados en el momento del diseo dentro de las herramientas de desarrollo compatibles con los Beans. Aqu podemos ver las dos formas ms tpicas de personalizar un Bean.
q

Utilizando un editor de propiedades. Cada propiedad del Bean tiene su propio editor. Normalmente las herramientas de desarrollo muestran los editores de propiedades de un Bean en una hoja de propiedades. Un editor de propiedades est asociado y edita un tipo de propiedad particular. Utilizando personalizadores. Los personalizadores ofrecen un completo control GUI sobre la personalizacin del Bean. Estos personalizadores se utilizan all donde los editores de propiedades no son prcticos o no se pueden aplicar. Al contrario que un editor de propiedad, que est asociado con una propiedad, un personalizador est asociado con un Bean.

Editores de Propiedades
Un editor de propiedad es una herramienta para personalizar un tipo de propiedad particular. Los editores de propiedades se muestran, o se activan desde la hoja de propiedades. Una hoja de propiedades determinar el tipo de la propidad, buscar un editor de propiedad adecuado, y mostrar el valor actual de la propiedad de una forma adecuada. Los editores de propiedades deben implementar el interface PropertyEditor. Este interface proporciona mtodos que especifican cuando una propiedad debe ser mostrada en una hoja de propiedades. Aqu tienes la hoja de propiedades del BeanBox contiendo las propiedades de OurButton.

Se empieza el proceso de edicin de estas propiedades pulsando sobre la entrada de la propiedad en la hoja.
q

q q

Las propiedades label y fontSize se muestran en un campo de texto editable. Los cambios se realizan all mismo. Las propiedades largeFont y debug son cajas de seleccin con elecciones discretas. Pulsando sobre las entradas foreground, background,y font se desplegarn paneles separados.

Cada uno de ellos se muestra dependiendo de los mtodos de PropertyEditor que hayamos implementado para que devuelvan valores distintos de null. Por ejemplo, el editor de propiedad int implementa el mtodo setAsText(). Esto indica a la hoja de propiedades que la propiedad puede ser mostrada como un String, y lo hace en un campo de texto editable. Los editores de propiedades Color y Font utilizan un panel separado, y slo utilizan la hoja de propiedades para mostrar el valor actual de la propiedad. Este editor se muestra pulsando sobre ese valor. Para mostar el valor actual de la propiedad dentro de la hoja de propiedades, necesitamos sobreesciribr isPaintable() para que devuelva true, y paintValue() para que dibuje el nuevo valor de la propiedad en un rectngulo en la hoja de propiedades. Aqu tienes como ColorEditor implementa paintValue().

public void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box) { Color oldColor = gfx.getColor(); gfx.setColor(Color.black); gfx.drawRect(box.x, box.y, box.width-3, box.height-3); gfx.setColor(color); gfx.fillRect(box.x+1, box.y+1, box.width-4, box.height-4); gfx.setColor(oldColor); }
Para soportar el editor de propiedades personalizado, necesitamos sobreescribir dos mtodos ms: supportsCustomEditor() para que devuelva true, y getCustomEditor() para que devuelve un ejemplar del editor personalizado. ColorEditor.getCustomEditor() devuelve this. Adems, la clase PropertyEditorSupport mantiene una lista de PropertyChangeListener y lanza notificaciones de eventos de cambio de propiedad a dichos oyentes cuando una propiedad compartida ha cambiado.

Como se Asocian los Editores de Propiedades con las Propiedades


Los editores de propiedades son descubiertos y asociados con una propiedad dada mediante.
q

La asociacin explcita mediante un objeto BeanInfo. El Bean Molecule utiliza esta tcnica. Dentro de la clase MoleculeBeanInfo, el editor de propiedades del Bean Molecule se selecciona con la siguiente lnea de cdigo. pd.setPropertyEditorClass(MoleculeNameEditor.class); Registro explcito mediante java.Beans.PropertyEditorManager.registerEditor(). Este mtodo toma un par de argumentos: el tipo de la clase, y el editor asociado con ese tipo. Busqueda por nombre. Si una clase no tiene asociado explcitamente un editor de propiedades, entonces el PropertyEditorManager busca la clase del editor de propiedad mediante. r Aadiendo "Editor" al nombre totalmente cualificado de la clase. Por ejemplo, para la clase java.beans.ComplexNumber, el manejador del editor de propiedades buscar la clase java.beans.ComplexNumberEditor class. r Aadiendo "Editor" al nombre de la clase y buscando la clase en el path de bsqueda. El path de bsqueda por defecto del BeanBox est en sun.beans.editors.

Los Editores de Propiedades del BDK


El DBK proporciona editores para tipos de datos primitivos como int, bool, float, y para los tipos de clases como Color y Font. El cdigo fuente para estos editores est en beans/apis/sun/beans/editors. Estos fuentes son un buen punto de entrada para escribir tus propios editores. Algunas cosas a observar sobre los editores de propiedades del BDK.
q

Todas las propiedades "numricas" estn representadas como objetos String. El IntEditor sobreescribe PropertyEditorSupport.setAsText(). El editor de propiedades bool es un men de elecciones discretas. Sobreescribiendo el mtodo

PropertyEditorSupport.getTags() para que devuelva un String[] que contenga "True" y "False". public String[] getTags() { String result[] = { "True", "False" }; return result; } Los editores de propiedades Color y Font implementan un editor personalizado. Porque estos objetos requieren un interface ms sofisticado para ser fcilmente editados en un componente separado que se despliega para hacer la edicin de la propiedad. Sobreescibir supportsCustomEditor() para que devuelva true indica a la hoja de propiedades que este editor de propiedad es un componente personalizado. Los mtodos isPaintable() y paintValue() tambin son sobreescritos para proporcionar el color y la fuente en las reas de ejemplo de la hoja de propiedades.

El cdigo fuente de estos editores de propiedades est en beans/apis/sun/beans/editors. Observa que si no se encuentra un editor de propiedades para una propiedad, el BeanBox no mostrar esa propiedad en la hoja de propiedades.

Personalizadores
Cuando se utiliza un Personalizador de Bean, se obtiene el control completo sobre la configuracin o edicin del Bean. Un personalizador es como una aplicacin que especficamente contiene la personalizacin de un Bean. Algunas veces las propiedades son insuficientes para representar los atributos configurables de un Bean. Los Personalizadores se usan cuando se necesita utilizar instrucciones sofisticadas para modificar un Bean, y cuando los editores de propiedades son demasiados primitivos para conseguir la personalizacin del Bean. Todos los personalizadores deben.
q q

q q

Descender de java.awt.Component o de una de sus subclases. Implementar el interface java.beans.Customizer. Esto significa la implementacin de mtodos para registrar objetos PropertyChangeListener, y lanzar eventos de cambio de propiedad a dichos oyentes cuando ocurre un cambio en el Bean fuente. Implementar un constructor por defecto. Asociar el personalizador con la clase fuente mediante BeanInfo.getBeanDescriptor().

Si un Bean asociado con un Personalizador es arrastrado dentro del BeanBox, podrs ver un tem "Customize..." en el men Edit.

Personalizadores del BDK


El OurButtonCustomizer sirve como ejemplo para demostrar el mecanismo de construccin de un personalizador.OurButtonCustomizer.
q q

Desciende de java.awt.Panel (una subclase de Component). Implementa el interface Customizer, y utiliza un objeto PropertyChangeSupport para manejar el registro y notificacin de PropertyChangeListener. Puedes ver la pgina Propiedades Compartidas para una descripcin de PropertyChangeSupport. Implementa un constructor por defecto. public OurButtonCustomizer() { setLayout(null); } Esta asociado con su clase fuente, ExplicitButton, mediante ExplicitButtonBeanInfo. Aqu ienes las sentencias de ExplicitButtonBeanInfo que hacen la asociacin. public BeanDescriptor getBeanDescriptor() { return new BeanDescriptor(beanClass, customizerClass); } ... private final static Class customizerClass = OurButtonCustomizer.class;

Los Beans BridgeTester y JDBC Select tambin tienen personalizadores.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Persistencia de un Bean
r r r r

Controlar la Serializacin Serializacin por Defecto: El Interface Serializable Serializacin Selectiva Utilizando el Modificador transient Serializacin Selectiva: writeObject y readObject()
s

Ejemplo: el Bean Molecule Ejemplo: Los Beans BlueButton y OrangeButton

El Interface Externalizable
s

Persistencia de un Bean
Un Bean persiste cuando tiene sus propiedades, campos e informacin de estado almacenadas y restauradas desde un fichero. El mecanismo que hace posible la persistencia se llama serializacin. Cuando un ejemplar de bean es serializado se convierte en una canal de datos para ser escritos. Cualquier Applet, aplicacin o herramienta que utilice el Bean puede "recontistuirlo" mediante la deserializacin. Los JavaBeans utilizan el API Object Serialization del JDK para sus necesidades de serializacin. Siempre que una clase en el rbol de herencia implemente los interfaces Serializable o Externalizable, esa clase ser serializable. Todos los Bean deben persisitir. Para persistir, nuestros Beans deben soportar la serializacin implementando los interfaces java.io.Serializable o java.io.Externalizable. Estos interfaces te ofrecen la eleccin entre serializacin automtica y "hazlo tu mismo".

Controlar la Serializacin
Se puede controlar el nivel de serializacin de nuestro Bean.
q q q

Automtico: implementando Serializable. Todo es serializado. Excluyendo los campos que no se quieran serializar marcndolos con el modificador transient (o static). Escribir los Beans a un fichero de formato especfico: implementando Externalizable, y sus dos mtodos.

Serializacin por Defecto: El Interface Serializable


El interface Serializable proporciona serializacin automtica mediante la utilizacin de las herramientas de Java Object Serialization. Serializable no declara mtodos; acta como un marcador, dicindole a las herramientas de Serializacin de Objetos que nuestra clase Bean es serializable. Marcar las clases con Serializable significa que le estamos diciendo a la Mquina Virtual Java (JVM) que estamos seguros de que nuestra clase funcionar con la serializacin por defecto. Aqu tenemos algunos puntos importantes para el trabajo con el interface Serializable.
q

q q

Las clases que implementan Serializable deben tener un constructor sin argumentos. Este constructor ser llamado cuando un objeto sea "reconstituido" desde un fichero .ser. No es necesario implementar Serializable en nuestra subclase si ya est implementado en una superclase. Todos los campos excepto static y transient son serializados. Utilizaremos el modificador transient para especificar los campos que no queremos serializar, y para especificar las clases que no son serializables.

El BeanBox escribe los Beans serializables a un fichero con la extensin .ser. El Bean OurButton utiliza la serializacin por defecto para conseguir la persistencia de sus propiedades. OurButton slo aade Serializable a su definicin de clase para hacer uso de la serializacin por defecto.

public class OurButton extends Component implements Serializable,...


Si arrastramos un ejemplar de OurButton al BeanBox, la hoja de propiedades muestra las propiedades de OurButton. Lo que nos asegura que la serializacin est funcionando.

1. Cambia algunas de las propiedades de OurButton. Por ejemplo cambia el tamao de la fuente y los colores. 2. Serializa el ejemplar de OurButton modificado seleccionando el men File|SerializeComponent... del BeanBox. Apareceza un dialogo para guardar el fichero. 3. Pon el fichero .ser en un fichero JAR con un manifiesto adecuado. 4. Limpia el BeanBox seleccionando el men File|Clear. 5. Recarga el ejemplar serializado el men File|LoadJar.
El ejemplar OurButton aparecer en el BeanBox con las propiedades modificadas intactas. Implementando Serializable en nuestra clase, las propiedades primitivas y los campos pueden ser serializados. Para miembros de la clase ms complejos se necesita utilizar tcnicas diferentes.

Serializacin Selectiva Utilizando el Modificador transient


Para excluir campos de la serializacin de un objeto Serializable, marcaremos los campos con el modificador transient.

transient int Status;


La serializacin por defecto no serializa los campos transient y static.

Serializacin Selectiva: writeObject y readObject()


Si nuestra clase serializable contiene alguno de los siguientes mtodos (las firmas deben ser exactas), el serializacin por defecto no tendr lugar.

private void writeObject(java.io.ObjectOutputStream out) throws IOException; private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
Se puede controlar cmo se serializarn los objetos ms complejos, escribiendo nuestras propias implementacin de los mtodos writeObject() y readObject(). Implementaremos writeObject cuando necesites ejercer mayor control sobre la serializacin, cuando necesitemos serializar objetos que la serializacin por defecto no puede manejar, o cuando necesitamos aadir datos a un canal de serializacin que no son miembros del objeto. Implementaremos readObject() para recronstruir el canal de datos para escribir con writeObject().

Ejemplo: el Bean Molecule


El Bean Molecule mantiene un nmero de versin en un campo esttico. Como los campos estticos no son serializables por defecto, writeObject() y readObject() son implementados para serializar este campo. Aqu estn las implementaciones de writeObject() y readObject() de Molecule.java.

private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { s.writeInt(ourVersion); s.writeObject(moleculeName); } private void readObject(java.io.ObjectInputStream s) throws java.lang.ClassNotFoundException, java.io.IOException { // Compensate for missing constructor. reset(); if (s.readInt() != ourVersion) { throw new IOException("Molecule.readObject: version mismatch"); } moleculeName = (String) s.readObject(); }
Estas implementaciones lmitan los campos serializados a ourVersion y moleculeName. Ningn otro dato de la clase ser serializado. Es mejor utilizar los mtodos defaultWriteObject() y defaultReadObject de ObjectInputStream

antes de hacer nuestras propias especificaciones en el canal de escritura. Por ejemplo.

private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { //First write out defaults s.defaultWriteObject(); //... } private void readObject(java.io.ObjectInputStream s) throws java.lang.ClassNotFoundException, java.io.IOException { //First read in defaults s.defaultReadObject(); //... } El Interface Externalizable
Este interface se utiliza cuando necesitamos un completo control sobre la serializacin de nuestro Bean (por ejemplo, cuando lo escribimos y leemos en un formato de fichero especfico). Necesitamos implementar dos mtodos: readExternal() y writeExternal(). Las clases Externalizable tambin deben tener un constructor sin argumentos.

Ejemplo: Los Beans BlueButton y OrangeButton


Cuando ejecutamos BeanBox, podemos ver dos Beans llamados BlueButton y OrangeButton en el ToolBox. Estos dos Beans son realmente dos ejemplares serializados de la clase ExternalizableButton. ExternalizableButton implementa el interface Externalizable. Esto significa que hace toda su propia serializacin, mediante la implementacin de Externalizable.readExternal() y Externalizable.writeExternal(). El programa BlueButtonWriter es utilizado por los makefile de los botones para crear un ejemplar de ExternalizableButton, cambiar su propiedad background a azul, escribir el Bean en un fichero BlueButton.ser. OrangeButton se crea de la misma manera, utilizando OrangeButtonWriter. El makefile pone estos ficheros .ser en buttons.jar, donde el ToolBox puede encontrarlos y recontistuirlos.

TutorJava recomienda...

Beans (Bsico)

En esta pgina:
q

Nuevas Caractersticas de JavaBeans

Nuevas Caractersticas de JavaBeans


Glasgow es una versin del BDK, cuyas caractersitcas son.
q

El Java Activation Framework (JAF). El JAF es un tipo de datos y un API de registro de comandos. Con el JAF se puede descubrir el tipo de datos de un objeto arbitrario, y buscar comandos, aplicaciones o Beans que puedan procesar ese tipo de datos, y activar el comando apropiado a la gestin del usuario. Por ejemplo, un navegador puede identificar el tipo de los datos de un fichero, y lanzar el plug-in adecuado para ver o editar el fichero. El JAF es una extensin del estndard de Java. Se puede obtener una copia desde el site de Glasgow web. El Protocolo de Contenidos y Servicios, tambin conocido como beancontext. Antes de este protocolo un Bean solo conocia y tenia acceso a la Mquina Virtual Java (JVM) en la que el Bean se ejecutaba, y al corazn del API Java. Este protocolo presenta una forma estndard para que los Beans puedan descubrir y acceder a los atributos o servicios proporcionados por un entorno del Bean, para descubrir y acceder a los atributos y servicios del Bean.
El API java.beans.beancontext presenta la posibilidad de anidar Beans y contextos de Beans en una estructura de rbol. En el momento de la ejecucin, un Bean puede obtener servicios desde su entorno contenedor; el Bean puede asegurarse estos servicios, o propagar estos servicios a cualquier Bean que l contenga.

Soporte de "Drag and Drop" . El API java.awt.dnd proporciona soporte para "Arrastrar y Soltar" entre aplicaciones Java y aplicaciones nativas de la plataforma.

Você também pode gostar