Conseils pour écrire des classes BeanInfo pour l'éditeur visuel

La présente section contient quelques règles que vous pouvez appliquer si vous écrivez une classe BeanInfo pour un bean Java utilisé dans un éditeur visuel Java.

L'éditeur visuel pour Java utilise les descripteurs de propriétés indiqués dans la classe BeanInfo pour établir la liste des entrées dans la vue Propriétés et déterminer comment les modifier.

Si une propriété java.beans.PropertyDescriptor est masquée, elle n'apparaît pas dans l'afficheur Propriétés. Toutefois, les méthodes set des propriétés masquées seront analysées par le générateur de code et appliquées aux beans actifs.

Lorsqu'une propriété est masquée, elle est malgré tout traitée par la procédure d'analyse syntaxique du code mais elle n'est pas utilisée dans les autres vues ni par les autres fonctions de l'éditeur visuel. VisualAge Age for Java permettait d'exclure une propriété de la vue Propriétés tout en la mettant à la disposition d'autres fonctions. Par exemple, des connexions sont établies en associant la phase de conception à la valeur false. Bien que l'éditeur visuel ne soit pas doté de fonctions de connexion, le concept de propriétés liées à la phase de conception est maintenu. Pour que la conception d'une propriété soit considérée comme "false", la valeur d'attribut doit être définie avec la clé de ivjDesignTimeProperty, et la valeur de Boolean.FALSE. 

Par exemple, si une classe BeanInfo est écrite pour la classe MyJavaBean qui possède une propriété de nom (d'une paire de méthodes public void setName(String) et public String getName()), la méthode getPropertyDescriptors() peut être écrite sous la forme suivante :

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;
}

Lorsqu'une propriété est sélectionnée dans la vue Propriétés, un éditeur est créé dans la colonne Valeur où vous pouvez indiquer une nouvelle valeur. Pour définir l'éditeur d'une propriété, java.beans.PropertyDescriptor est interrogé. Si un éditeur de propriétés est associé, il est utilisé. Sinon, le programme recherche un éditeur configuré pour fonctionner avec le type de propriété. Vous ne pouvez pas modifier la liste des éditeurs de propriétés pré-définis pour un type. Si java.beans.PropertyEditor est défini dans le descripteur de propriétés ou pour le type de propriété, la vue Propriétés tente de déterminer le type d'éditeur à créer. Les règles appliquées sont les suivantes :

  1. Si la méthode public boolean supportsCustomEdit() renvoie true, un éditeur de boîte de dialogue est créé. Le bouton de la boîte de dialogue lance l'éditeur renvoyé par la méthode Component getCustomEditor(). L'éditeur renvoyé doit être une sous-classe de java.awt.Component, et sera hébergé par un bouton OK et Cancel dans un élément Frame ou JFrame.
  2. Si la méthode public String[] getTags() renvoie un tableau de chaînes, elles apparaissent dans une liste. Le libellé utilisé pour une valeur existante dans la vue Propriétés résulte de l'appel de public void setValue(Object) avec la valeur de la propriété, puis de l'appel de public String getAsText() pour déterminer la chaîne à utiliser. Lorsque vous sélectionnez une nouvelle valeur dans la liste, la méthode de l'éditeurpublic void setAsText(String) est appelée et la nouvelle valeur de la propriété est extraite à l'aide de public Object getValue().
  3. Si aucune des deux méthodes ci-dessus ne renvoie un éditeur personnalisé ou des balises, un éditeur de zones de texte est créé dans la feuille Propriétés. La valeur du texte initialement affichée résulte de l'appel de public void setValue(Object) et de public String getAsText(). Lorsqu'une nouvelle chaîne est entrée dans l'éditeur de texte avec le clavier, la méthode public void setAsText(String) est appelée. Si la méthode génère une exception java.lang.IllegalArgumentException, le message correspondant s'affiche dans la barre d'état et la valeur n'est pas appliquée. Si aucune exception n'est générée et que vous appuyez sur la touche Entrée dans l'éditeur de texte (ou si une autre propriété de la vue Propriétés est activée), public Object getValue() est envoyé sous forme d'argument à la méthode set décrite dans le descripteur de propriété.

Pour chaque java.beans.PropertyEditor, la méthode public String getJavaInitializationString() doit également être spécialisée. Cela permet de renvoyer la chaîne utilisée dans le code source Java sous forme d'argument transmis à la méthode set du descripteur de déploiement. Cette chaîne doit renvoyer la valeur et tous les types référencés doivent être complets et ne pas reposer sur des instructions d'importation dans la classe composée. Si l'élément BeanInfo spécialise le modèle de classe JRE, java.beans.SimpleBeanInfo, la méthode n'est pas abstraite et est héritée pour renvoyer '???' . Vous devez la spécialiser correctement.

Outre l'utilisation de la méthode public String[] getTags() dans le descripteur de propriétés pour extraire une liste, il existe une méthode plus rapide pour définir une liste de valeurs. Une valeur d'attribut est créée avec la clé de enumerationValues, une valeur qui représente un tableau de trois entrées pour l'élément displayName de la liste, la valeur elle-même et l'élément initializationString. A titre d'exemple, considérons une propriété appeléedirection, associée au type int et à laquelle les valeurs 0, 1, 2 et 3 peuvent être affectées. Ces valeurs représentent des références aux zones statiques NORTH, EAST, SOUTH et WEST pour la classe myclasses.CompassPoint. Le descripteur de propriétés peut apparaître sous la forme suivante :

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;
}

La seconde valeur de chaque entrée n'est pas la zone statique int, telle que myclasses.CompoassPoint.NORTH mais une instance de java.lang.Integer. En effet, les types de primitives ne peuvent pas être placés dans un tableau associé au type Object ; Leur élément java.lang equivalent doit être utilisé à la place.

Evénements Bean Info

La liste des événements affichée pour un bean Java représente les descripteurs de méthode préconisés pour les descripteurs d'événements associés.

Si une classe adaptateur est disponible, elle est ajoutée à java.beans.EventDescriptor sous forme d'attribut nommé avec la clé "eventAdapterClass", par exemple

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

Rubrique parent : Classes BeanInfo et introspection

Tâches connexes
Contrôle des informations BeanInfo pour les développeurs de plug-in
Spécification de l'emplacement des classes BeanInfo

(C) Copyright IBM Corporation 1999, 2004. All Rights Reserved.