Consejos para escribir clases BeanInfo para el editor visual

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:

  1. Si el método public boolean supportsCustomEdit() devuelve true, se crea un editor de diálogo. El botón de diálogo lanza el editor devuelto por el método public Component getCustomEditor(). El editor devuelto debe ser una subclase de java.awt.Component, y se ubicará con un botón Aceptar y Cancelar en un Frame o JFrame, según sea necesario.
  2. Si el método public String[] getTags() devuelve una matriz de series, se muestran en una lista. La etiqueta que se utiliza para un valor existente en la vista Propiedades es el resultado de la llamada a public void setValue(Object) con el valor de propiedad, y luego la llamada a public String getAsText() para determinar la Serie (String) a utilizar. Cuando se selecciona un nuevo valor en la lista, se invoca el método del editor public void setAsText(String), y se recupera el nuevo valor de propiedad utilizando public Object getValue().
  3. Si ninguno de los dos métodos anteriores devuelve un editor o código personalizado, en la hoja Propiedades se creará un editor de campo de texto. El valor de texto que inicialmente se visualiza es el resultado de la invocación de public void setValue(Object) y public String getAsText(). Cuando se entra una serie nueva en el editor de texto, en cada pulsación de tecla se invoca el método public void setAsText(String). Si el método lanza una excepción java.lang.IllegalArgumentException, el mensaje de la excepción se muestra en la barra de estado y el valor no se aplica. Si no se lanza excepción alguna, cuando se pulse la tecla Intro del editor de texto (o si otra propiedad de la vista Propiedades obtiene el enfoque), el resultado de la invocación de public Object getValue() se envía como argumento al método set descrito en el descriptor de propiedad.

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.

Eventos de Bean Info

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");

Tema padre: Clases BeanInfo e introspección

Tareas relacionadas
Control de la información de BeanInfo para desarrolladores de conectores (plug-in)
Especificación de la ubicación de las clases BeanInfo

(C) Copyright IBM Corporation 1999, 2004. Reservados todos los derechos.