Vous êtes sur la page 1sur 8

JavaBeans

Introduccin: componentes
Uno de los paradigmas de la programacin es aprovechar el cdigo que ya est creado. Inicialmente la primera idea fue crear mdulos y funciones que luego se aprovechan en otras aplicaciones. A esto se le llama reutilizar cdigo. Empez con un mero copiar y pegar, para mejorar haciendo que las funciones se agruparan en libreras que se invocaban desde el cdigo. Se mejor an ms la idea con la llegada de la programacin orientada a objetos. Las clases mediante las que se definen objetos encapsulan mtodos y propiedades, y esto posibilita disear aplicaciones ms fcilmente. Las clases se pueden utilizar en distintas aplicaciones. Las clases tambin se agrupan en libreras (o paquetes como en el caso de Java). Pero desde hace aos, el aprovechamiento del cdigo ha sufrido una notable mejora con la llegada de los llamados lenguajes visuales (como Visual Basic y Delphi). En estos lenguajes, se pueden colocar objetos en el cdigo simplemente pintndolos en un rea visual. En estos lenguajes se disea el formulario de la aplicacin y se arrastran los distintos componentes desde un cuadro de herramientas. Se modifican las propiedades de los componentes y finalmente se aade el cdigo necesario (que ser muy poco). Como desventaja, estos lenguajes se abstraen tanto del cdigo que no son adecuados para resolver algunos problemas (que Java s es perfectamente capaz de resolver). Realmente es una solucin ideal para la programacin de elementos visuales. A este tipo de elementos que funcionan como bloques de construccin de aplicaciones, es a los que se les llama componentes. De este modo una aplicacin no es ms que un conjunto de componentes funcionando conjuntamente. Los componentes representan desde cosas tan sencillas como un botn a cosas ms complicadas como un procesador de textos. La idea adems es incluso hacer que este modelo funcione para cualquier plataforma de ordenador y para cualquier lenguaje.Esto ltimo no se ha llegado a conseguir del todo. Tecnologas como CORBA otorgan un modelo de componentes independiente del lenguaje gracias a una capa que hace de interfaz entre el lenguaje que accede al componente y el servidor CORBA que proporciona el componente. Todos los componentes deben seguir un modelo concreto a fin de que puedan fabricarse herramientas de desarrollo que permitan el trabajo con los componentes de manera visual.

JavaBeans
Los JavaBeans son los componentes fabricados con la tecnologa Java. El nombre se podra traducir como grano de Java (o grano de caf, ya que en Estados Unidos se llama Java al caf por el consumo que se hace del caf procedente de la isla de Java), es decir es lo que forma una aplicacin Java completa.

La idea es la misma que la comentada anteriormente como referencia a los componentes, se colocan directamente JavaBeans en una aplicacin y se utilizan sin conocer su interior. Como adems se utiliza un modelo concreto, numerosas aplicaciones de desarrollo permitirn trabajar con los JavaBeans a fin de facilitarnos su manejo. Dichas herramientas nos permitirn desde un entorno visual (al ms puro estilo Delphi o Visual Basic) manipular las propiedades del componente sin tocar en absoluto el cdigo. Al manipular el Bean podremos examinar sus propiedades, eventos y mtodos. Esto se consigue mediante una caracterstica fundamental de los JavaBeans que es la reflexin. La reflexin permite conseguir informacin del JavaBean aunque no dispongamos de la misma en forma documental (la obtenemos directamente de su cdigo). Los JavaBeans admiten su serializacin, es decir, se puede almacenar su estado en tiempo de ejecucin. Aunque JavaBeans desde la versin 1.1 de Java apareci con una vocacin visual, lo cierto es que se pueden utilizar no solo como componentes visuales herederos de la clase Component (aunque sigue siendo parte de su utilizacin fundamental); as por ejemplo las pginas JSP estn muy preparadas para trabajar con JavaBeans.

Areas principales de los JavaBeans


El modelo ideado por Sun para los JavaBeans incluye cinco reas fundamentales que los JavaBeans han de cumplir: 1. Manejo de eventos. La posibilidad de que los JavaBeans entreguen eventos a otros componentes. Se ampla el modelo de eventos de AWT para conseguir un modelo ms personalizado y sencillo de manipulacin de eventos. 2. Propiedades. Las propiedades definen las caractersticas de los componentes. Los JavaBeans implementan una manera normalizada de utilizar las propiedades. 3. Persistencia. Relacionada con la posibilidad de almacenar el estado del JavaBean (se basa en la serializacin). 4. Introspeccin. Permite a los propios JavaBeans proporcionar informacin sobre sus propiedades y mtodos. Tiene que ver con la reflexin comentada anteriormente. 5. APIs de diseo de componentes. Los JavaBeans estn pensados para utilizarse en entornos que permiten su personalizacin. De este modo el diseo de aplicaciones se realiza en tiempo de diseo de manera ms efectiva.

Propiedades de los JavaBeans


Los JavaBeans no poseen una clase raz. No obstante, los visuales tienen como padre (directa o indirectamente) la clase Component. La realidad de los JavaBeans es que son clases normales que pueden ser examinadas de manera especial por las herramientas de desarrollo. Las propiedades de los JavaBeans pueden ser examinadas por esas herramientas para poder ser editadas de forma visual. Para que esas herramientas detecten de manera correcta las propiedades, stas tienen que utilizar el modelo de desarrollo correcto de JavaBeans. En ese modelo se define la forma de acceder a las propiedades.

Propiedades simples.
Son propiedades que permiten su uso mediante mtodos get/set (obtener/cambiar). Las propiedades permiten cambiar su valor usando el mtodo set correspondiente (por ejemplo para cambiar la propiedad ttulo se utilizara setTtulo("Imagen principal")). El valor de la propiedad se obtiene mediante mtodo get (por ejemplo getTtulo() devolvera la cadena Imagen principal). Hay una excepcin a lo comentado anteriormente; si la propiedad es booleana, entonces para obtener su valor se usa el mtodo is (por ejemplo isTtuloActivo()) que lgicamente devuelve true o false dependiendo del estado de la propiedad.

Propiedades indexadas.
Son propiedades que admiten una serie concreta de valores. En este caso hay cuatro mtodos de acceso. Si la propiedad es por ejemplo Notas y representa un array de nmeros double. Entonces tendramos: double[] getNotas(): Devolvera el array de notas. double getNotas(int i): Devuelve la nota nmero i void setNotas(int i, double nota): Cambia el valor de la nota nmero i para que tome el valor indicadp void setNotas(double[] notas): Hace que el contenido de la propiedad sea el contenido del array utilizado.

Propiedades dependientes.
Permiten mandar mensajes de modificacin de propiedades a otros Beans cuando una propiedad cambia, de este modo se ligan dos componentes; cuando el primero cambia, el segundo se da cuenta y realiza una determinada accin. Por ejemplo si tenemos un Java que muestra imgenes y un componente que sirve para rellenar rutas de archivo, podemos hacer que al cambiar la propiedad de la ruta, el cuadro de la imagen muestre la imagen correspondiente a esa ruta. El proceso para realizar este mecanismo es: 1. Cuando cambia el valor de la propiedad, el componente enva un evento de tipo PropertyChangeEvent a todos los objetos registrados como escuchadores (listeners) del componente. Las clases relacionadas con estos eventos estn en el paquete java.beans. 2. Para permitir que haya componentes que escuchen al JavaBean hay que definir dos mtodos: void addPropertyChangeListener (PropertyChangeListener escuchador) void removePropertyChangeListener (PropertyChangeListener escuchador) El primer mtodo sirve para aadir un escuchador. El segundo sirve para quitar un escuchador. 3. El componente escuchador debe implementar la PropertyChangeListener que le obligar a definir el propertyChanged, mtodo que gestiona este tipo de eventos. interfaz mtodo

Definir el funcionamiento de esos mtodos es una tarea muy compleja, por eso existe una clase llamada java.beans.PropertyChangeSupport que tiene definido el cdigo de esos mtodos a fin de que cualquier clase lo pueda aprovechar. Para ello en el Bean necesitamos un objeto de este tipo, definida de la siguiente forma: private PropertyChangeSupport cambios= new PropertyChangeSupport(this); En el constructor se indica el objeto al que se le quiere dar soporte (lo normal es this). Y ahora la definicin de los mtodos anteriores, la definicin sera: public void addPropertyChangeListener(PropertyChangeListener pcl){ cambios.addPropertyChangeListener(pcl); } public void removePropertyChangeListener(PropertyChangeListener pcl){ cambios.removePropertyChangeListener(pcl); } Para lanzar eventos PropertyChangeEvent a los escuchadores, se utiliza el mtodo firePropertyChange cada vez que se cambia el valor de la propiedad. A este mtodo se le pasan tres parmetros: el nombre de la propiedad, el valor antiguo y el valor nuevo. Los valores antiguos y nuevos deben de ser objetos, lo que obliga a utilizar las clases envoltorio Integer, Double, Boolean, Char, etc. para poder pasar valores de tipos bsicos. Un detalle importante a tener en cuenta es que si la clase deriva de la clase Swing JComponent (o cualquier subclase), lo cual es muy comn ya que casi todos los JavaBeans heredan de esa clase, entonces no es necesario implementar los mtodos addPropertyChangeListener y removePropertyChangeListener ya que ya estn implementados en la clase padre. En este caso, para notificar un cambio de propiedad basta usar el mtodo firePropertyChange de la clase JComponent (adems en el mtodo firePropertyChange de JComponent s que se pueden pasar como valores los tipos bsicos int, double, boolean, char, ...). Lgicamente cualquier JavaBean que desee escuchar eventos de tipo PropertyChangeEvent deben implementar la interfaz PropertyChangeListener. Esa interfaz obliga a definir el mtodo: void propertyChange(PropertyChangeEvent e): Este mtodo es llamado cuando se modifica el valor de la propiedad. Por su parte el evento PropertyChangeEvent que recibe este mtodo nos proporciona estos mtodos: Object getOldValue() Obtiene el valor antiguo de la propiedad (el valor anterior al cambio) Object getNewValue() Obtiene el nuevo valor de la propiedad. String getPropertyName() Obtiene el nombre de la propiedad que cambi (puede ser null si cambiaron varias propiedades a la vez).

Propiedades restringidas
Es la propiedad ms compleja de implementar, pero admite posibilidades muy interesantes. La idea es similar a la de las propiedades dependientes; se valoran cambios de valor en un JavaBean. Sin embargo, en este caso se basa en que el objeto oyente de eventos (eventos de veto) puede vetar los cambios si no se ajustan a unas determinadas caractersticas. Cuando una propiedad puede dar lugar a un veto, es cuando se dice que la propiedad es restringida. La mayor parte de restricciones en una propiedad se pueden programar desde el propio JavaBean. Esta idea es muy interesante cuando la restriccin depende de los valores de varios componentes. Para que un componente cualquier pueda indicar que hay objetos escuchadores, necesita tener como mtodos miembro, los siguientes: void addVetoableChangeListener(VetoableChangeListener escuchador) Hace que el objeto escuchador, sea capaz capturar eventos de tipo PropertyVetoEvent void removeVetoableChangeListener(VetoableChangeListener escuch) Hace que el objeto escuch deje de escuchar los eventos de veto. Una vez ms, como definir estos mtodos es muy complejo, se puede crear un objeto VetoableChangeSupport para conseguir un soporte sencillo a fin de definir los mtodos anteriores:

//en el constructor del JavaBean private VetoableChangeSupport soporteVeto= new VetoableChangeSupport(this); //...fuera del constructor public void addVetoableChangeListener(VetoableChangeListener vcl){ cambios.addVetoableListener(vcl); } public void removeVetoableChangeListener (VetoableChangeListener vcl){ cambios.removeVetoableChangeListener (vcl); } Los componentes que deriven de JComponent no necesitan este cdigo ya que todos estos mtodos estn definidos. El lanzamiento del evento se realiza mediante el mtodo fireVetoableChange (de la clase JComponent o de la clase VetoableChangeSupport), que requiere tres parmetros: el nombre de la propiedad que cambia (en forma de String), el valor antiguo de la propiedad y el valor nuevo de la propiedad. Los valores antiguo y nuevo deben ser de tipo Object lo que significa que si la propiedad es de tipo bsica habr que usar un clase evolvente (Integer, Boolean,...). fireVetoableChange debe ser llamado cada vez que se cambia la propiedad.

La escucha de este tipo de eventos la realiza cualquier objeto que pertenezca a clases que implementen la interfaz VetoableChangeListener esta interfaz obliga a definir el mtodo siguiente: public void vetoableChange(PropertyChangeEvent ev) throws PropertyVetoException Se puede observar que este mtodo recibe un objeto del tipo PropertyChangeEvent (no hay eventos VetoableChangeEvent) y que lanza excepciones del tipo PropertyVetoException. De hecho la clave del funcionamiento de este tipo de propiedades la tiene esta excepcin. El mtodo vetoableChange tiene que lanzar (mediante la instruccin throw) excepciones de ese tipo cuando el cambio de valor en la propiedad no se pueda realizar debido a que no cumple una condicin. El lanzamiento de estas excepciones tiene esta sintaxis: throw new PropertyVetoException(String mensaje, PropertyChangeEvent evento) El objeto de excepcin lanzado permite obtener el mensaje (mtodo getMessage) y el evento que desencaden la excepcin (getPropertyChangeEvent). En resumen, los pasos para la realizacin de una propiedad restringida seran los siguientes: El JavaBean que posee la propiedad restringida debe tener definidos los mtodos addVetoableChangeListener y removeVetoableChange-Listener. Si no los tiene definidos (por no ser clase heredera de JComponent), se puede ayudar de un objeto VetoableChangeSupport para definirlos. El mtodo setPropiedad de la propiedad restringida, debe lanzar el evento de veto mediante fireVetoableChange. A la que se pasa un texto con la propidad que cambia, el valor antiguo y el valor nuevo. Ese mtodo debe capturar o lanzar excepciones PropertyVetoException ya que la instruccin anterior puede dar lugar a esa excepcin: public void setValor(String nuevo){ try{ String valorAntiguo=getValor(); fireVetoableChange("valor",nuevo,valorAntiguo);//posible //excepcin ...//Si el cdigo siguiente se ejecuta no hubo excepcin } catch(PropertyVetoException pve){ ...//Cdigo que se ejecuta en caso de excepcin } } El objeto oyente de los eventos de tipo veto, debe implementar la interfaz VetoableChangeListener. Esta interfaz obliga a definir el mtodo vetoableChange

que ser llamado cada vez que se lance el evento de veto (que ocurrir normalmente cada vez que la propiedad cambie): public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException{ //.. Comprobacin de las condiciones throw new PropertyVetoException("mensaje",evt);//Slo si //las condiciones de veto se cumplen

Empaquetamiento de JavaBeans
Uno de los principales objetivos de un JavaBean visual es ser utilizado en terceras aplicaciones como un componente visual ms. Los Java Beans se empaquetan en archivos JAR. En el caso de los Java Beans, el archivo manifest se tiene que editar obligatoriamente. En dicho archivo hay que indicar qu clases del paquete JAR son Beans. En el contenido de este archivo, hay que aadir una lnea Name indicando el nombre de la clase que implementa el Bean (incluyendo el paquete en el que est la clase, la ruta del paquete se indica con smbolos / en lugar del punto, por ejemplo com/miPaquete/clase.class) y una lnea con el texto Java-Bean: True. Ejemplo: Manifest-Version 1.0 Name: CuadroTextoFijo.class Java-Bean: True Name: CuadroNumrico.class Java-Bean: True Se supone que ambas clases implementan JavaBeans. En el archivo JAR hay que empaquetar todos los archivos necesarios. Notse que en el caso de que el JavaBean hubiera sido desarrollado en el contexto de un proyecto ms complejo (es decir, las clases de Bean forman parte del conjunto de clases del proyecto) no sera necesario la exportacin en jar para hacer uso del mismo.

Uso del JavaBean en un entorno de desarrollo


Desde hace aos Java permite la descarga de una aplicacin llamada BDK (Beans Developer Kit, kit de desarrollo de Beans). Esta herramienta incluye un programa (llamado beanbox) para probar JavaBeans. Hoy en da no se utiliza mucho ya que los IDE para desarrollar aplicaciones Java como NetBeans, JBuilder o Eclipse incluyen herramientas ms avanzadas de manejo de JavaBeans. En estos entornos, los JavaBeans se arrastran directamente desde las barras de herramientas hacia un contenedor, desde ah se manipulan. En el caso de Eclipse, se puede seleccionar un JavaBean con la opcin choose bean disponible en la barra de componente del Visual Editor. Una vez insertado se le manipulan las propiedades iniciales desde el propio editor. Ntese que en realidad lo nico que se hace es seleccionar la clase que implementa el Bean. Si dicha clase est en un paquete jar externo, este paquete deber estar incluido en el classpath del proyecto.

A continuacin se muestra un figura donde se ilustra lo que explicado anteriormente. El cdigo del Bean CrearPersonaBean que se ilustra en la imagen est disponible en el PoliformaT.

Vous aimerez peut-être aussi