Tips for å skrive BeanInfo-klasser for det visuelle redigeringsprogrammet

Denne delen beskriver noen regler du kan bruke hvis du skal skrive en BeanInfo-klasse for en Java-bønne som skal brukes i det visuelle redigeringsprogrammet for Java.

Det visuelle redigeringsprogrammet for Java bruker egenskapsdeskriptorene beskrevet i BeanInfo-klassen til å etablere listen over oppføringer i Egenskaper-visningen, i tillegg til hvordan de skal redigeres.

Hvis en java.beans.PropertyDescriptor er skjult, vil den ikke være tilgjengelig i Egenskaper-visningen. Men oppgitte metoder med skjulte egenskaper vil likevel bli analysert av kodegeneratoren og bli tatt i bruk i de aktive bønnene.

Når en egenskap er skjult, blir den likevel brukt i kodeanalyseringen, men den vil ikke bli inkludert i andre visninger eller funksjoner for det visuelle redigeringsprogrammet. VisualAge for Java tillot at en egenskap ble ekskludert fra Egenskaper-visningen, samtidig som den var tilgjengelig for andre funksjoner. For eksempel opprette tilkoblinger ved å gjøre den false (usann) under designfasen. Selv om det visuelle redigeringsprogrammet for Java ikke har tilkoblingsfunksjonalitet, blir konseptet med designfaseegenskaper overført. Hvis en egenskap skal være usann under designfasen, skal attributtverdien oppgis med nøkkelen ivjDesignTimeProperty og verdien Boolean.FALSE.

Hvis for eksempel en BeanInfo-klasse blir skrevet for MyJavaBean-klassen som har en navneegenskap (fra metodeparet public void setName(String) og public String getName()), kan metoden getPropertyDescriptors() skrives på denne måten:

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 blir valgt i Egenskaper-visningen, blir det opprettet et redigeringsprogram i Verdi-kolonnen der du kan oppgi en ny verdi. Hvis du vil beregne redigeringsprogrammet for en egenskap, blir det spurt i java.beans.PropertyDescriptor etter et redigeringsprogram for egenskaper. Hvis et tilknyttet redigeringsprogram for egenskaper blir funnet, blir det brukt. Hvis ikke, blir det funnet et som er definert slik at det virker sammen med egenskapstypen. Du kan ikke påvirke listen over forhåndsdefinerte egenskapsredigeringsprogrammer for en type. Hvis det blir funnet en java.beans.PropertyEditor i egenskapsdeskriptoren eller for egenskapstypen, vil Egenskaper-visningen prøve å bestemme typen redigeringsprogram som skal opprettes. Disse reglene blir brukt:

  1. Hvis metoden public boolean supportsCustomEdit() returnerer true (sann), blir det opprettet et redigeringsprogram for dialogboks. Dialogboksknappen starter redigeringsprogrammet som er returnert fra metoden public Component getCustomEditor(). Det returnerte redigeringsprogrammet skal være en subklasse av java.awt.Component, og det blir lagret med knappen OK og Avbryt i en Frame eller JFrame etter behov.
  2. Hvis metoden public String[] getTags() returnerer en matrise med strenger, blir de vist på en liste. Etiketten som er brukt for en eksisterende verdi i Egenskaper-visningen, er resultatet av et kall til public void setValue(Object) med egenskapsverdien, etterfulgt av et kall til public String getAsText() for å bestemme hvilken streng som skal brukes. Når du velger en ny verdi på listen, blir redigeringsprogrammets metode public void setAsText(String) kalt, og den nye egenskapsverdien blir hentet med public Object getValue().
  3. Hvis ingen av de to metodene over returnerer et tilpasset redigeringsprogram eller koder, blir det opprettet et tekstfeltredigeringsprogram i Egenskaper-arket. Tekstverdien som blir vist først, er et resultat av et kall til public void setValue(Object) og public String getAsText(). Når det oppgis en ny streng i tekstredigeringsprogrammet ved hvert tasttrykk, blir det sendt et kall til public void setAsText(String). Hvis metoden kaster en java.lang.IllegalArgumentException, blir unntaksmeldingen vist på statuslinjen, og verdien blir ikke brukt. Hvis det ikke blir kastet et unntak, og du klikker på Enter-tasten i tekstredigeringsprogrammet (eller en annen egenskap i Egenskaper-visningen får fokus), blir resultatet av et kall til public Object getValue() sendt som argumentet til den definerte metoden som er beskrevet i egenskapsdeskriptoren.

For hver java.beans.PropertyEditor må metoden public String getJavaInitializationString() også spesialiseres. Dette returnerer strengen som blir brukt i Java-kildekoden som argumentet til set-metoden i egenskapsdeskriptoren. Denne strengen skal returnere verdien, og eventuelle typer det refereres til i strengen, skal være fullt kvalifiserte og ikke være avhengige av noen importsetninger i klassen som settes sammen. Hvis BeanInfo spesialiserer JRE-malklassen java.beans.SimpleBeanInfo, er ikke metoden abstrakt og vil returnere '???'. Du må huske å spesialisere den på riktig måte.

I tillegg til å bruke metoden public String[] getTags() i en egenskapsdeskriptor for å få en liste, er det en raskere måte å oppgi en liste over verdier på. En attributtverdi blir opprettet med nøkkelen enumerationValues, en verdi som er en matrise med tredoble oppføringer av displayName på listen, selve verdien og initializationString. Tenk deg for eksempel at du har en egenskap som kalles direction som blir skrevet til int, og som kan tildeles verdiene 0,1, 2 og 3. Disse er referanser til de statiske feltene NORTH, EAST, SOUTH og WEST i klassen myclasses.CompassPoint. Egenskapsdeskriptoren kan skrives slik:

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 andre verdien i hver av oppføringene er ikke selve det statiske int-feltet, for eksempel myclasses.CompoassPoint.NORTH, men i stedet en forekomst av java.lang.Integer. Dette skyldes at primitive typer ikke kan legges i en matrise som skrives til Object, så java.lang equivalent må brukes i stedet.

BeanInfo-hendelser

Listen over hendelser som blir vist i en Java-bønne, er de foretrukne metodedeskriptorene på hendelsesdeskriptorene.

Hvis en adapterklasse er tilgjengelig, bør den legges til i java.beans.EventDescriptor som et navngitt attributt med nøkkelen "eventAdapterClass", for eksempel

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.