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