I det här avsnittet beskrivs vissa regler som du kan utplacera om du skriver en BeanInfo-klass för en Java-böna som är ämnad för användning i den visuella redigeraren för Java.
I den visuella redigeraren för Java används de egenskapsbeskrivare som beskrivs i BeanInfo-klassen för att skapa listan med poster i egenskapsvyn och bestämma hur de ska redigeras.
Om en java.beans.PropertyDescriptor är dold är den inte tillgänglig i visningsprogrammet för egenskaper. set-metoder för dolda egenskaper tolkas dock av kodgeneratorn och tillämpas på aktiva bönor.
När en egenskap är dold används den ändå i kodtolkning men ingår inte i andra funktioner eller vyer i den visuella redigeraren. VisualAge for Java tillät en egenskap att uteslutas från egenskapsvyn men den var ändå tillgänglig för andra funktioner. Exempel: göra anslutningar genom att göra den false för designläge. Även om det inte går att ansluta den visuella redigeraren för Java används konceptet designlägesegenskaper. Om du vill ange värdet false för ett egenskapsdesignläge anger du ett attributvärde med nyckeln ivjDesignTimeProperty och värdet Boolean.FALSE.
Exempel: om en BeanInfo-klass skrivs för den MyJavaBean-klass som har en namnegenskap (från metodparet public void setName(String) och public String getName()) kan metoden getPropertyDescriptors() skrivas på följande sätt.
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; }
När en egenskap väljs i egenskapsvyn skapas en redigerare i värdekolumnen där du kan ange ett nytt värde. Vid beräkning av redigeraren för en egenskap får java.beans.PropertyDescriptor en fråga om en egenskapsredigerare. Om en associerad egenskapsredigerare hittas används den. I annat fall görs en sökning efter en som är definierad att arbeta med den egenskapstypen. Du kan inte ändra listan med fördefinierade egenskapsredigerare för en typ. Om en java.beans.PropertyEditor hittas i egenskapsbeskrivaren eller för egenskapstypen görs ett försök i egenskapsvyn att bestämma den typ av redigerare som ska skapas. Regler som används:
För varje java.beans.PropertyEditor måste även metoden public String getJavaInitializationString() specialiseras. Då returneras den sträng som används i Java-källkoden som argument tillset-metoden för egenskapsbeskrivaren. I den här strängen bör värdet returneras och typer som refereras till i strängen ska vara fullständigt definierade och inte beroende av eventuella importsatser i den klass som skapas. Om BeanInfo specialiserar mall-JRE-klassen java.beans.SimpleBeanInfo är metoden inte abstrakt och kommer att ärvas och returnera '???'. Du måste komma ihåg att specialisera den rätt.
Förutom användning av metoden public String[] getTags() för en egenskapsbeskrivare för att skapa en lista finns det ett kortare sätt att ange en lista med värden. Ett attributvärde skapas med nyckeln enumerationValues, ett värde som är en vektor med tredubbla poster för displayName i listan, själva värdet och initializationString. Ett exempel är en egenskap med namnet direction som anges som int och kan tilldelas värdena 0,1, 2 och 3. De är referenser till de statiska fälten NORTH, EAST, SOUTH och WEST för klassen myclasses.CompassPoint. Egenskapsbeskrivaren kan till exempel skrivas på följande sätt:
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; }
Det andra värdet i posterna är inte det statiska fältet int, till exempel myclasses.CompoassPoint.NORTH, utan en förekomst av java.lang.Integer. Det beror på att det inte går att lägga primitiva typer i en vektor som är angiven som Object, så deras java.lang equivalent måste användas i stället.
Den lista med händelser som visas för en Java-böna är de rekommenderade metodbeskrivarna för bönans händelsebeskrivare.
Om en adapterklass är tillgänglig bör den läggas till i java.beans.EventDescriptor som ett namngivet attribut med nyckeln "eventAdapterClass", till exempel
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");