Tip til skrivning af BeanInfo-klasser til Visuel editor

Dette afsnit beskriver nogle regler, du kan anvende, hvis du skal skrive en BeanInfo- klasse for en Java-bean til brug i den visuelle editor til Java.

Den visuelle editor til Java bruger de egenskabsdeskriptorer, der er beskrevet i BeanInfo-klassen, til at etablere listen over indgange i oversigten Egenskaber, samt hvordan de skal redigeres.

Hvis en java.beans.PropertyDescriptor er skjult, er den ikke tilgængelig i fremviseren Egenskaber. Men sætmetoder af skjulte egenskaber analyseres stadigvæk af kodegeneratoren og anvendes til live-beans.

Når en egenskab er skjult, benyttes den stadig af kodeanalysefunktionen, men den inkluderes ikke i nogen anden visuel editoroversigt eller -funktion. VisualAge til Java tillod, at en egenskab blev udelukket fra oversigten Egenskaber, men var stadig tilgængelig for andre funktioner. Eksempel: oprettelse af forbindelser ved at gøre designtid false. Selvom den visuelle editor til Java ikke indeholder forbindelsesmuligheder, benyttes begrebet designtidsegenskaber stadig. For at gøre egenskabsdesigntid falsk skal en attributværdi angives med nøglen ivjDesignTimeProperty og Boolean.FALSE.

For eksempel hvis en BeanInfo-klasse skrives for MyJavaBean-klasse, som har en navneegenskab (fra en public void setName(String) og public String getName() method pair), kan getPropertyDescriptors()-metoden skrives på følgende måde:

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 egenskab vælges i oversigten Egenskaber, oprettes en editor i kolonnen Værdi, hvor du kan angive en ny værdi. For at beregne editoren for en egenskab forespørges på java.beans.PropertyDescriptor efter en egenskabseditor. Hvis en tilknyttet egenskabseditor er fundet, benyttes den. Ellers findes en, der er defineret til brug sammen med egenskabstypen. Du kan ikke påvirke listen over de foruddefinerede egenskabseditorer for en type. Hvis en java.beans.PropertyEditor findes i egenskabsdeskriptoren eller fundet for egenskabstypen , forsøger oversigten Egenskaber at bestemme, hvilken type editor der skal oprettes. Følgende regler benyttes:

  1. Hvis metoden public boolean supportsCustomEdit() returnerer true, oprettes en dialogbokseditor. Dialogboksknappen starter den editor, der returneres fra metoden public Component getCustomEditor(). Den editor, der returneres, bør være en underklasse af java.awt.Component, og den understøttes af en OK- og Annullér-knap i en ramme eller JFrame efter behov.
  2. Hvis metoden public String[] getTags() returnerer en array af strenge, vises de i en liste. Den etiket, der bruges til en eksisterende værdi i oversigten Egenskaber, er resultatet af et kald til public void setValue(Object) med egenskabsværdien og derefter et kald til public String getAsText() for at bestemme, hvilken streng der skal bruges. Når du vælger en værdi i listen, kaldes editorens metode public void setAsText(String), og den nye egenskabsværdi hentes vha. public Object getValue().
  3. Hvis ingen af ovenstående to metoder returnerer en tilpasset editor eller kode, oprettes en tekstfelteditor på egenskabsarket. Den første tekstværdi, der vises, er resultatet af kaldet til public void setValue(Object) og public String getAsText(). Når en ny streng angives i teksteditoren, kaldes public void setAsText(String) for hvert tastanslag. Hvis metoden returnerer en java.lang.IllegalArgumentException, vises undtagelsesmeddelelsen i statuslinjen, og værdien anvendes ikke. Hvis der ikke returneres en undtagelse, når du trykker på Enter-tasten i teksteditoren, eller hvis en anden egenskab i oversigten Egenskaber får fokus, sendes resultatet af kaldet til public Object getValue() som argumentet til den angivne metode, der er beskrevet i egenskabsbeskrivelsen.

For hver java.beans.PropertyEditor skal metoden public String getJavaInitializationString() også specialiseres. Dette returnerer den streng, der bruges i Java-kildekoden som argumentet til metoden set i egenskabsdeskriptoren. Denne streng bør returnere værdien, og eventuelle typer, der refereres til i strengen, skal være fuldt kvalificeret og ikke være afhængige af nogen import-sætninger i den klasse, der sammensættes. Hvis din BeanInfo specialiserer JRE-skabelonklassen java.beans.SimpleBeanInfo, er metoden ikke abstract og overtages til at returnere '???'. Du skal huske at specialisere korrekt.

Foruden at bruge metoden public String[] getTags() på en egenskabsdeskriptor til at hente en liste er der er en nemmere måde at angive en værdiliste på. Der oprettes en attributværdi med nøglen enumerationValues, en værdi, der er et array af tredobbelte indgange for displayName i listen, selve værdien og initializationString. Som et eksempel kan du overveje en egenskab, der hedder direction, som skrives til int og kan tildeles værdierne 0,1, 2 og 3. Det er referencer til static-felterne NORTH, EAST, SOUTH og WEST for klassen myclasses.CompassPoint. Egenskabsdeskriptoren kan skrives på følgende måde:

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

Den anden værdi i hver af angivelserne er ikke selve int static-feltet, f.eks. myclasses.CompoassPoint.NORTH, men i stedet for en forekomst af java.lang.Integer. Det er fordi primitive typer ikke kan sættes i et array, der skrives til Object, og derfor skal java.lang equivalent benyttes i stedet for.

BeanInfo-aktiviteter

Den liste over aktiviteter, som vises for en Java-bean, er de foretrukne metodedeskriptorer for dens aktivitetsdeskriptorer.

Hvis en adapterklasse er tilgængelig, skal den føjes til java.beans.EventDescriptor som en navngiven attribut med en nøgle, f.eks "eventAdapterClass"

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.