Tips för att skriva BeanInfo-klasser för den visuella redigeraren

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:

  1. Om metoden public boolean supportsCustomEdit() returnerar true skapas en dialogredigerare. Med dialogknappen startas den redigerare som returnerades från method public-komponenten getCustomEditor(). Den returnerade redigeraren bör vara en underordnad klass till java.awt.Component, och den används med en OK- och Avbryt-knapp i en Frame eller JFrame efter behov.
  2. Om metoden public String[] getTags() returnerar en vektor av strängar visas de i en lista. Den etikett som används för ett befintlig värde i egenskapsvyn är resultatet av att anropa public void setValue(Object) med egenskapsvärdet och att anropa public String getAsText() för att bestämma vilken sträng som ska användas. När du väljer ett nytt värde i listan anropas redigerarmetoden public void setAsText(String) och det nya egenskapsvärdet hämtas med hjälp av public Object getValue().
  3. Om ingen av de ovanstående metoderna returnerar en anpassad redigerare eller märkord skapas en textfältsredigerare i egenskapsarket. Det textvärde som först visas är resultatet av anrop till public void setValue(Object) och public String getAsText(). När en ny sträng anges i textredigeraren för varje tangentnedtryckning anropas metoden public void setAsText(String). Om metoden orsakar ett java.lang.IllegalArgumentException, visas undantagsmeddelandet i statusfältet och värdet används inte. Om inget undantag inträffar när tangenten Enter används i textredigeraren (eller om fokus sätts på någon annan egenskap i egenskapsvyn) skickas resultatet av anrop till public Object getValue() som argument till den set-metod som beskrivs i egenskapsbeskrivaren.

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.

BeanInfo-händelser

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

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