In deze sectie worden een aantal regels beschreven die u kunt gebruiken als u een BeanInfo-klasse schrijft voor een Java-bean die is bedoeld voor gebruik in de Visual Editor.
De Visual Editor gebruikt de eigenschappen-descriptors die zijn beschreven in de BeanInfo-klasse om de lijst met items samen te stellen in de view Eigenschappen en om te bepalen hoe deze moeten worden bewerkt.
Als een java.beans.PropertyDescriptor verborgen is, is deze niet beschikbaar in de viewer Eigenschappen. De set-methoden van verborgen eigenschappen worden echter nog steeds ontleed door de codegenerator en worden toegepast op de actieve beans.
Als een eigenschap verborgen is, wordt deze nog steeds gebruikt voor code-ontleding, maar wordt deze niet opgenomen in een andere view of feature Visual Editor. VisualAge for Java stond toe dat een eigenschap werd uitgesloten van de view Eigenschappen, maar was nog steeds beschikbaar voor andere functies. Bijvoorbeeld het maken van verbindingen door de ontwerptijdeigenschap op false te zetten. Hoewel de Visual Editor niet beschikt over verbindingsvoorzieningen, wordt het concept van ontwerptijdeigenschappen doorgezonden. Om een ontwerptijdeigenschap op false te zetten, moet een kenmerkwaarde worden ingesteld met de sleutel ivjDesignTimeProperty en de waarde Boolean.FALSE.
Als bijvoorbeeld een BeanInfo-klasse wordt geschreven voor de klasse MyJavaBean die een naameigenschap heeft (van een methodenpaar public void setName(String) en public String getName()), kan de getPropertyDescriptors()-methode als volgt worden geschreven:
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; }
Wanneer de eigenschap geselecteerd wordt in de view Eigenschappen, wordt een editor gemaakt in de kolom Waarde, waarin u een nieuwe waarde kunt opgeven. Om de editor te berekenen voor een eigenschap, wordt een query uitgevoerd op java.beans.PropertyDescriptor voor een eigenschappeneditor. Als een bijbehorende eigenschappeneditor wordt aangetroffen, wordt deze gebruikt. Als dit niet het geval is, wordt er een opgezocht die is gedefinieerd voor het werken met dit type eigenschap. U hebt geen invloed op de lijst met vooraf gedefinieerde eigenschappeneditors van een bepaald type. Als een java.beans.PropertyEditor wordt aangetroffen in de eigenschappendescriptor of voor het type eigenschap, wordt door de view Eigenschappen geprobeerd vast te stellen welk type editor moet worden gemaakt. De regels die worden gebruikt zijn de volgende:
Voor elke java.beans.PropertyEditor geldt dat de methode public String getJavaInitializationString() ook moet worden gespecialiseerd. Deze zendt de tekenreeks terug die in de Java-broncode wordt gebruikt als argument voor de set-methode van de eigenschappendescriptor. Deze tekenreeks moet de waarde terugzenden en de typen waarnaar wordt verwezen in de tekenreeks moeten volledig gekwalificeerd zijn en mogen niet afhankelijk zijn van imports in de klasse die wordt opgesteld. Als uw BeanInfo de sjabloon-JRE-klasse java.beans.SimpleBeanInfo specialiseert, is de methode niet abstract en wordt deze overgenomen om '???' terug te zenden. Het is belangrijk dat u eraan denkt deze correct te specialiseren.
Behalve het gebruik van de openbare methode String[] getTags() op een eigenschappendescriptor om een lijst op te halen, is er ook een snellere manier om een lijst met waarden op te geven. Een kenmerkwaarde wordt gemaakt met de sleutel enumerationValues, een waarde die een array is van drievoudige vermeldingen van de displayName in de lijst, de waarde zelf en de initializationString. Bijvoorbeeld een eigenschap direction die wordt getypeerd naar int en de waarden 0, 1, 2 en 3 toegewezen kan krijgen. Dit zijn verwijzingen naar de statische velden NORTH, EAST, SOUTH en WEST van de klasse myclasses.CompassPoint. De eigenschappendescriptor kan als volgt worden geschreven:
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; }
De tweede waarde in elk van de vermeldingen is niet het statische veld int zelf, zoals myclasses.CompoassPoint.NORTH maar in plaats daarvan is het een instance van java.lang.Integer. Dit omdat de primitieve typen niet in een array kunnen worden geplaatst die is getypeerd als Object, zodat in plaats hiervan het java.lang equivalent moet worden gebruikt.
De lijst met events die wordt afgebeeld op een Java-bean is de voorkeursmethodedescriptors met de eventdescriptors.
Als een adapterklasse beschikbaar is, moet deze worden toegevoegd aan java.beans.EventDescriptor als een benoemd kenmerk met de sleutel "eventAdapterClass". Bijvoorbeeld
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");