Tips voor het schrijven van BeanInfo-klassen voor de Visual Editor

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:

  1. Als de methode public boolean supportsCustomEdit() true verzendt, wordt een dialoogvenster-editor gemaakt. Door de dialoogknop wordt de editor gestart die is teruggezonden van de method public Component getCustomEditor(). De editor die wordt teruggezonden, moet een subklasse zijn van java.awt.Component en wordt naar behoefte beschikbaar gesteld met de knoppen OK en Annuleren in een Frame of in een JFrame.
  2. Als de methode public String[] getTags() een array van tekenreeksen terugstuurt, worden deze in een lijst afgebeeld. Het label dat wordt gebruikt voor een bestaande waarde in de view Eigenschappen is het resultaat van het aanroepen van public void setValue(Object) met de eigenschapwaarde, en vervolgens het aanroepen van public String getAsText() om vast te stellen welke tekenreeks moet worden gebruikt. Als u een nieuwe waarde in de lijst selecteert, wordt de editormethode public void setAsText(String) aangeroepen en wordt de nieuwe eigenschapwaarde met behulp van public Object getValue() opgehaald.
  3. Als geen van beide bovenstaande methoden een aangepaste editor of tags terugzendt, wordt een tekstveldeditor gemaakt in het Eigenschappenblad. De tekstwaarde die in het begin wordt weergegeven, is het resultaat van het aanroepen van public void setValue(Object) en public String getAsText(). Als bij elke toetsaanslag een nieuwe tekenreeks wordt ingevoerd in de teksteditor, wordt de methode public void setAsText(String) aangeroepen. Als de methode een java.lang.IllegalArgumentException verwerpt, wordt het uitzonderingsbericht afgebeeld in de statusbalk en wordt de waarde niet toegepast. Als geen uitzondering wordt verworpen als u op Enter drukt in de teksteditor (of als een andere eigenschap in de view Eigenschappen de focus krijgt), dan wordt het resultaat van het aanroepen van public Object getValue() verzonden als argument om de methode in te stellen die is beschreven in de eigenschappendescriptor.

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.

BeanInfo-events

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

(C) Copyright IBM Corporation 1999, 2004. Alle rechten voorbehouden.