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