Tipps für das Schreiben von BeanInfo-Klassen für den Visual Editor

Dieser Abschnitt befasst sich mit einigen Regeln, die Sie anwenden können, wenn Sie eine BeanInfo-Klasse für eine Java-Bean schreiben, die für die Verwendung im Visual Editor für Java vorgesehen ist.

Der Visual Editor für Java verwendet die Eigenschaftsdeskriptoren, die in der BeanInfo-Klasse beschrieben werden, um die Liste der Einträge in der Eigenschaftsansicht sowie die Art, in der sie editiert werden sollten, festzulegen.

Wenn ein java.beans.PropertyDescriptor verdeckt ist, steht er in der Anzeigefunktion der Eigenschaften nicht zur Verfügung. Jedoch werden die gesetzten Methoden der verdeckten Eigenschaften weiterhin durch den Codegenerator syntaktisch analysiert und auf die aktiven Beans angewandt.

Wenn eine Eigenschaft verdeckt ist, wird sie weiterhin durch die Code-Syntaxanalyse verwendet, aber sie wird nicht in andere Sichten oder Features des Visual Editors aufgenommen. VisualAge für Java ermöglichte, dass eine Eigenschaft aus der Eigenschaftsansicht ausgeschlossen wird, dass sie anderen Funktionen aber weiterhin zur Verfügung steht. Zum Beispiel die Herstellung einer Verbindung durch Setzen der Entwicklungszeit auf false. Obschon der Visual Editor für Java keine Verbindungsmöglichkeiten hat, wird das Konzept der Entwicklungszeiteigenschaften fortgeführt. Um die Entwicklungszeit einer Eigenschaft auf 'false' zu setzen, muss ein Attributwert mit dem Schlüssel ivjDesignTimeProperty und dem Wert von Boolean.FALSE.  gesetzt werden.

Wenn zum Beispiel eine BeanInfo-Klasse für die Klasse MyJavaBean geschrieben wird, die eine Nameneigenschaft hat (von einem Methodenpaar public void setName(String) und public String getName()), dann könnte die Methode getPropertyDescriptors() wie folgt geschrieben werden:

public PropertyDescriptor[] getPropertyDescriptors() { 
    PropertyDescriptor[] result = new PropertyDescriptor[1]; 
    try{ 
        PropertyDescriptor directionDescriptor = new
PropertyDescriptor("direction",MyJavaBean.class); 
        directionDescriptor.setValue("enumerationValues",new
Object[]{ 
            "Nord",neu
Integer(myclasses.CompassPoint.NORTH),"myclasses.CompassPoint.NORTH",

            "Ost",neu
Integer(myclasses.CompassPoint.EAST),"myclasses.CompassPoint.EAST",

            "Süd",neu
Integer(myclasses.CompassPoint.SOUTH),"myclasses.CompassPoint.SOUTH",

            "West",neu
Integer(myclasses.CompassPoint.WEST),"myclasses.CompassPoint.WEST" 
        }); 
        result[0] = directionDescriptor; 
    } catch ( IntrospectionError exc ) { 
    } 
    	return result;
}

Wenn eine Eigenschaft in der Eigenschaftsansicht gewählt wird, wird ein Editor in der Wertspalte erstellt, der Ihnen die Angabe eines neuen Wertes ermöglicht. Um den Editor für eine Eigenschaft zu berechnen, wird java.beans.PropertyDescriptor nach einem Eigenschaftseditor abgefragt. Wenn ein entsprechender Eigenschaftseditor gefunden wird, wird er verwendet. Andernfalls wird einer gesucht, der für die Arbeit mit der Eigenschaftsart definiert worden ist. Sie können die Liste der vordefinierten Eigenschaftseditoren für eine Art nicht beeinflussen. Wenn ein java.beans.PropertyEditor im Eigenschaftsdeskriptor oder einer für die Eigenschaftsart gefunden wurde, wird die Eigenschaftsansicht versuchen, die Art des zu erstellenden Editors zu bestimmen. Folgende Regeln werden verwendet:

  1. Wenn die Methode public boolean supportsCustomEdit() den Wert true zurückgibt, wird ein Dialogeditor erstellt. Über die Schaltfläche 'Dialog' wird der von der Methode public Component getCustomEditor() zurückgegebene Editor gestartet. Bei dem zurückgegebenen Editor muss es sich um eine Unterklasse von java.awt.Component handeln, und er wird mit einer Schaltfläche 'OK' und Abbrechen' in einem Frame oder JFrame, wie erforderlich, angezeigt.
  2. Wenn die Methode public String[] getTags() einen Bereich von Zeichenfolgen zurückgibt, werden diese in einer Liste angezeigt. Die für einen vorhandenen Wert in der Eigenschaftsansicht verwendete Bezeichnung ist das Ergebnis des Aufrufs von public void setValue(Object) mit dem Eigenschaftswert und des darauffolgenden Aufrufs von public String getAsText() zur Festlegung der zu verwendenden Zeichenfolge. Wenn Sie einen neuen Wert in der Liste auswählen, wird die Methode public void setAsText(String) des Editors aufgerufen und der neue Eigenschaftswert wird unter Verwendung von public Object getValue() abgerufen.
  3. Wenn keine der beiden obigen Methoden einen allgemeinen Editor oder tags zurückgibt, wird ein Textfeldeditor in der Eigenschaftsseite erstellt. Der anfangs dargestellte Textwert ist das Ergebnis des Aufrufs von public void setValue(Object) und public String getAsText(). Wenn eine neue Zeichenfolge in den Texteditor eingegeben wird, wird bei jeder Tastenbetätigung die Methode public void setAsText(String) aufgerufen. Wenn die Methode ein java.lang.IllegalArgumentException auslöst, wird die Ausnahmebedingungsnachricht in der Statusleiste angezeigt und der Wert wird nicht angewendet. Wenn beim Anklicken der Eingabetaste im Texteditor keine Ausnahmebedingung ausgelöst wird (oder wenn eine andere Eigenschaft in der Eigenschaftsanzeige hervorgehoben wird), wird das Ergebnis des Aufrufs von public Object getValue() als Argument an die im Eigenschaftsdeskriptor beschriebene Methode gesendet.

Für jeden java.beans.PropertyEditor muss die Methode public String getJavaInitializationString() ebenfalls angegeben werden. Dadurch wird die Zeichenfolge zurückgegeben, die im Java-Quellcode als das Argument für die Methode set des Eigenschaftsdeskriptors verwendet wird. Diese Zeichenfolge muss den Wert zurückgeben und alle in der Zeichenfolge angegebenen Typen müssen vollständig qualifiziert sein und sich nicht auf Importanweisungen in der erstellten Klasse verlassen. Wenn Ihre BeanInfo die JRE-Vorlagenklasse java.beans.SimpleBeanInfo angibt, dann ist die Methode nicht abstrakt und wird übernommen, um '???' zurückzugeben. Denken Sie daran, sie korrekt anzugeben.

Zusätzlich zur Verwendung der Methode 'public String[] getTags()' bei einem Eigenschaftsdeskriptor zur Erstellung einer Dropdown-Liste gibt es eine kürzere Methode, um eine Liste von Werten anzugeben. Ein Attributwert wird mit dem Schlüssel von enumerationValues erstellt, ein Wert, bei dem es sich um eine Gruppe dreier Einträge, des 'displayName' in der Liste, des Wertes selbst und des 'initializationString', handelt. Als Beispiel betrachten Sie eine Eigenschaft namens Richtung, die in int eingegeben wird und der die Werte 0,1, 2 und 3 zugeordnet werden können. Dies sind Verweise auf die statischen Felder NORD, OST, SÜD und WEST in der Klasse myclasses.CompassPoint. Der Eigenschaftsdeskriptor könnte wie folgt geschrieben werden:

public PropertyDescriptor[] getPropertyDescriptors() {
    PropertyDescriptor[] result = new PropertyDescriptor[1];
    try{
        PropertyDescriptor directionDescriptor
= new PropertyDescriptor("direction",MyJavaBean.class);
        directionDescriptor.setValue("enumerationValues",new
Object[]{
           
"Nord",neu
Integer(myclasses.CompassPoint.NORTH),"myclasses.CompassPoint.NORTH",
           
"Ost",neu
Integer(myclasses.CompassPoint.EAST),"myclasses.CompassPoint.EAST",
           
"Süd",neu
Integer(myclasses.CompassPoint.SOUTH),"myclasses.CompassPoint.SOUTH",
           
"West",neu
Integer(myclasses.CompassPoint.WEST),"myclasses.CompassPoint.WEST"
        });
        result[0] = directionDescriptor;
    } catch ( IntrospectionError exc ) {
    }
    	return result;
}

Der zweite Wert in jedem der Einträge ist nicht das 'int static field' selbst, wie z.B. myclasses.CompoassPoint.NORTH, sondern statt dessen eine Instanz von java.lang.Integer. Das liegt daran, dass Basiselementtypen nicht in einen Bereich eingegeben werden können, der in Object eingegeben wird und dass statt dessen ihre java.lang equivalent verwendet werden müssen.

Bean-Informationsereignisse

Die Liste der Ereignisse, die bei einer JavaBean angezeigt wird, ist der bevorzugte Methodendeskriptor bei ihren Ereignisdeskriptoren.

Wenn eine Adapterklasse zur Verfügung steht, sollte sie dem 'java.beans.EventDescriptor' als benanntes Attribut mit einem Schlüssel von "eventAdapterClass" hinzugefügt werden. Zum Beispiel:

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

Übergeordnetes Thema: BeanInfo-Klassen und Introspektion

Verwandte Tasks
Steuerung von BeanInfo-Informationen für Plug-in-Entwickler
Angeben der Speicherposition der BeanInfo-Klassen

(C) Copyright IBM Corporation 1999, 2004. Alle Rechte vorbehalten."