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