En este apartado se describen algunas reglas que se pueden emplear si se escribe una clase BeanInfo para un bean de Java que se pretende utilizar en el editor visual para Java.
El editor visual para Java utiliza los descriptores que se describen en la clase BeanInfo para establecer la lista de entradas en la vista Propiedades, así como la forma en que se deben editar.
Si hay un java.beans.PropertyDescriptor oculto, no estará disponible en el visor Propiedades. No obstante, los métodos establecidos de propiedades ocultas serán analizados por el generador de código y se aplicarán a los beans activos.
Cuando una propiedad está oculta, puede ser utilizada por el analizador de código, pero no se incluirá en ninguna otra vista o característica del Editor visual. VisualAge para Java permitía la exclusión de una propiedad de la vista Propiedades, pero aún estaba disponible para otras funciones. Por ejemplo, el establecimiento de conexiones en tiempo de diseño false. Aunque el editor visual para Java no tiene la posibilidad de conexión, el concepto de propiedades en tiempo de diseño se lleva adelante. Para hacer un tipo de diseño de propiedad falso, no debe establecerse un valor de atributo con la clave ivjDesignTimeProperty, y el valor de Boolean.FALSE.Â
Por ejemplo, si se está escribiendo una clase BeanInfo para la clase MyJavaBean que tiene una propiedad name (de una pareja de métodos public void setName(String) y public String getName()), el método getPropertyDescriptors() se podría escribir de la siguiente manera:
public PropertyDescriptor[] getPropertyDescriptors() { PropertyDescriptor[] result = new PropertyDescriptor[1]; try{ PropertyDescriptor directionDescriptor = new PropertyDescriptor("direction",MyJavaBean.class); directionDescriptor.setValue("enumerationValues",new Object[]{ "North",new Integer(myclasses.CompassPoint.NORTH),"myclasses.CompassPoint.NORTH", "East",new Integer(myclasses.CompassPoint.EAST),"myclasses.CompassPoint.EAST", "South",new Integer(myclasses.CompassPoint.SOUTH),"myclasses.CompassPoint.SOUTH", "West",new Integer(myclasses.CompassPoint.WEST),"myclasses.CompassPoint.WEST" }); result[0] = directionDescriptor; } catch ( IntrospectionError exc ) { } return result; }
Cuando se selecciona una propiedad en la vista Propiedades, se crea un editor en la columna Valor que permite especificar un valor nuevo. Para calcular el editor para una propiedad, se realiza una consulta a java.beans.PropertyDescriptor por un editor de propiedad. Si se encuentra un editor de propiedad asociado, se utiliza. Si no, se busca uno que esté definido para trabajar con el tipo de propiedad. No se puede influir sobre la lista de editores de propiedad predefinidos para un tipo. Si se encuentra un java.beans.PropertyEditor en el descriptor de propiedad o si se encuentra el tipo de propiedad, la vista Propiedades intentará determinar el tipo de editor a crear. Las reglas utilizadas serán:
Para todos los java.beans.PropertyEditor, el método public String getJavaInitializationString() también debe ser especializado. Así se devuelve una serie que se utiliza en el código fuente Java como argumento para el método set del descriptor de propiedad. Esta serie debería devolver el valor, y los tipos referenciados en la serie deberían estar totalmente calificados y no estar basados en sentencias de importación de la clase que se está componiendo. Si el BeanInfo especializa la clase JRE de plantilla java.beans.SimpleBeanInfo, el método no es abstracto y será heredado para devolver '???'. No hay que olvidar especializarlo correctamente.
Además de utilizar el método public String[] getTags() en un descriptor de propiedad para obtener una lista desplegable, hay una forma más rápida de especificar una lista de valores. Un valor de atributo se crea con la clave de enumerationValues, un valor que es una matriz de entradas triplicadas del displayName de la lista, el propio valor y la initializationString. Como ejemplo, consideremos una propiedad llamada direction cuyo tipo es int y se pueden asignar los valores 0, 1, 2 y 3. Son referencias a campos estáticos NORTH, EAST, SOUTH y WEST de la clase myclasses.CompassPoint. El descriptor de propiedad se debería escribir de la siguiente manera:
public PropertyDescriptor[] getPropertyDescriptors() { PropertyDescriptor[] result = new PropertyDescriptor[1]; try{ PropertyDescriptor directionDescriptor = new PropertyDescriptor("direction",MyJavaBean.class); directionDescriptor.setValue("enumerationValues",new Object[]{ "North",new Integer(myclasses.CompassPoint.NORTH),"myclasses.CompassPoint.NORTH", "East",new Integer(myclasses.CompassPoint.EAST),"myclasses.CompassPoint.EAST", "South",new Integer(myclasses.CompassPoint.SOUTH),"myclasses.CompassPoint.SOUTH", "West",new Integer(myclasses.CompassPoint.WEST),"myclasses.CompassPoint.WEST" }); result[0] = directionDescriptor; } catch ( IntrospectionError exc ) { } return result; }
El segundo valore de cada entrada no es el propio campo int estático como myclasses.CompoassPoint.NORTH, si no que es una instancia de java.lang.Integer. Esto es debido a que los tipos primitivos no se pueden poner en una matriz cuyo tipo sea Object, por lo que hay que utilizar sus equivalentes java.lang equivalent.
La lista de eventos que se muestra en un bean de Java son los descriptores de métodos preferentes en sus descriptores de evento.
Si hay disponible una clase de adaptador, debería añadirse al java.beans.EventDescriptor como atributo con nombre, y con una clave "eventAdapterClass". Por ejemplo:
EventSetDescriptor focusEventSetDescriptor = new EventSetDescriptor( Â java.awt.Component.class, Â "focus", Â java.awt.event.FocusListener.class, Â new String[] { "focusGained(java.awt.event.FocusEvent)", "focusLost(java.awt.event.FocusEvent)" }, Â "addFocusListener(java.awt.event.FocusListener)", Â "removeFocusListener(java.awt.event.FocusListener" ); focusEventSetDescriptor.setValue("eventAdapterClass", "java.awt.event.FocusAdapter");