In questa sezione sono illustrate alcune regole che è possibile adottare per la scrittura di una classe BeanInfo di un bean Java destinata all'utilizzo nell'editor visuale per Java.
L'editor visuale per Java utilizza i descrittori delle proprietà disponibili nella classe BeanInfo per definire l'elenco di voci nella vista Proprietà e il modo in cui dovranno essere modificate.
Se un java.beans.PropertyDescriptor è nascosto, non risulterà disponibile all'interno del visualizzatore di proprietà. Ciononostante, i metodi set delle proprietà nascoste continueranno ad essere analizzati dal generatore di codice e verranno applicati ai bean reali.
Quando una proprietà è nascosta, continua ad essere utilizzata dal programma di analisi del codice, ma non verrà inclusa in altre viste o funzioni dell'editor visuale. VisualAge per Java permetteva di escludere una proprietà dalla vista Proprietà, anche se questa continuava ad essere disponibile per altre funzioni, ad esempio, creare delle connessioni rendendola false in fase di progettazione. Sebbene l'editor visuale per Java non dispone di capacità di connessione, il concetto di proprietà in fase di progettazione è comunque rimasto. Per rendere false una proprietà in fase di progettazione, occorre impostare un attributo con la chiave di ivjDesignTimeProperty e il valore di Boolean.FALSE.Â
Ad esempio, se si sta scrivendo una classe BeanInfo per la classe MyJavaBean che abbia una proprietà name (tratta da una coppia di metodi public void setName(String) e public String getName()), sarà possibile scrivere il metodo getPropertyDescriptors() potrà nel modo seguente:
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; }
Quando si seleziona una proprietà nella vista Proprietà, viene creato un editor nella colonna Valore, in cui è possibile specificare un nuovo valore. Per calcolare l'editor di una proprietà, viene eseguita una query relativa all'editor nel java.beans.PropertyDescriptor. Verrà quindi utilizzato l'editor associato eventualmente trovato. In caso contrario, ne verrà individuato uno definito per la gestione del tipo di proprietà in questione. Non è possibile modificare l'elenco di editor delle proprietà predefiniti per un tipo. Se viene trovato un java.beans.PropertyEditor nel descrittore delle proprietà o per il tipo di proprietà, la vista Proprietà tenterà di stabilire il tipo di editor da creare. Le regole utilizzate sono:
Per ogni java.beans.PropertyEditor, occorre specializzare anche il metodo public String getJavaInitializationString(). Questo metodo restituisce la stringa utilizzata nel codice di origine Java come argomento del metodo set del descrittore delle proprietà. La stringa deve restituire il valore, inoltre qualsiasi tipo cui si fa riferimento nella stringa deve essere completo e non deve basarsi sulle istruzioni import della classe che verrà composta. Se la classe BeanInfo specializza la classe JRE modello java.beans.SimpleBeanInfo, il metodo non sarà abstract e verrà ereditato per restituire '???'. E' necessario ricordare di specializzarlo nel modo appropriato.
Oltre a utilizzare il metodo public String[] getTags() su un descrittore delle proprietà per ottenere un elenco, esiste un modo più rapido di specificare un elenco di valori. Si crea un valore di attributo con la chiave di enumerationValues, un valore che rappresenta una matrice di voci triplicate di displayName nell'elenco, il valore stesso e infine initializationString. Per fare un esempio, si consideri una proprietà denominata direction il cui tipo è int, a cui è possibile assegnare valori di 0, 1, 2 e 3. Questi sono riferimenti ai campi static NORTH, EAST, SOUTH e WEST nella classe myclasses.CompassPoint. Il descrittore della proprietà può essere scritto nel modo seguente:
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; }
Il secondo valore di ciascuna delle voci non è il campo int static stesso, quale ad esempio myclasses.CompoassPoint.NORTH, ma invece un'istanza di java.lang.Integer. Il motivo è dovuto al fatto che non è possibile inserire tipi primitivi in una matrice di tipo Object, pertanto dovrà essere utilizzato java.lang equivalent.
L'elenco di eventi visualizzato per un bean Java è quello relativo ai descrittori di metodo preferiti sui descrittori di evento.
Se è disponibile una classe adattatore, dovrà essere aggiunta a java.beans.EventDescriptor come attributo denominato con una chiave di "eventAdapterClass", ad esempio
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");
Argomento principale: Classi BeanInfo e introspezione
Attività correlate
Modalità di controllo delle informazioni BeanInfo per gli sviluppatori di plug-in
Indicazione del percorso delle classi BeanInfo