Rady pro psaní tříd BeanInfo pro vizuální editor

Tento oddíl popisuje některá pravidla, která můžete uplatnit při zápisu tříd BeanInfo pro objekt typu Java bean určený k použití ve vizuálním editoru pro prostředí Java.

Vizuální editor pro jazyk Java používá deskriptory vlastností popsané ve třídě BeanInfo pro vytvoření seznamu položek v pohledu Vlastnosti, stejně jako způsobu jejich úprav.

Pokud je java.beans.PropertyDescriptor skrytý, nebude dostupný v prohlížeči vlastností. Avšak metody set skrytých vlastností budou ještě analyzovány generátorem kódu a budou použity u aktivních objektů bean.

Pokud je vlastnost skrytá, stále ji používá analýza kódu, avšak není zahrnuta do žádného dalšího pohledu nebo funkce vizuálního editoru. VisualAge pro Javu umožňuje vyloučení vlastnosti z pohledu Vlastnosti, ale zachovává dostupnost pro další funkce. Například vytváření spojení v době návrhu s hodnotou false. Ačkoli vizuální editor pro Javu nemá schopnost spojení, koncept vlastností doby návrhu se přenáší dál. Pro změnu doby návrhu vlastnosti na hodnotu false by se měla hodnota atributu nastavit s klíčem ivjDesignTimeProperty, a hodnotou Boolean.FALSE.

Například pokud se zapisuje třída BeanInfo pro třídu MyJavaBean, která má vlastnost názvu (z páru metod public void setName(String) a public String getName()), metoda getPropertyDescriptors() by se mohla zapsat následujícím způsobem:

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;
}

Pokud je vybrána vlastnost v pohledu Vlastnosti, vytvoří se editor ve sloupci Hodnota, ve kterém je možno určit novou hodnotu. Pro výpočet editoru pro vlastnost je dotazován java.beans.PropertyDescriptor na editor vlastností. Pokud je nalezen přidružený editor vlastností, je tento editor použit. V opačném případě se vyhledá jiný, který je definován pro práci s daným typem vlastnosti. Nemáte možnost ovlivnit seznam předdefinovaných editorů vlastností pro daný typ. Pokud je nalezen java.beans.PropertyEditor v deskriptoru vlastností, nebo pro typ vlastnosti, pohled Vlastnosti se pokusí určit typ editoru, který se má vytvořit. Níže jsou uvedena použitá pravidla:

  1. Pokud metoda public boolean supportsCustomEdit() vrátí hodnotu true, vytvoří se editor dialogového okna. Tlačítko dialogového okna spouští editor vrácený metodou public Component getCustomEditor(). Vrácený editor by měl být podtřídou java.awt.Component a bude použit s tlačítky OK a Storno v rámci Frame nebo JFrame dle potřeby.
  2. Pokud metoda public String[] getTags() vrací pole řetězců, tyto řetězce se zobrazí na seznamu. Štítek použitý pro stávající hodnotu v pohledu Vlastnosti je výsledkem volání metody public void setValue(Object) s hodnotou vlastnosti a volání public String getAsText() pro určení řetězce, který se má použít. Jakmile vyberete novou hodnotu na seznamu, vyvolá se metoda editoru public void setAsText(String) a je načtena nová hodnota vlastnosti pomocí metody public Object getValue().
  3. Pokud žádná ze dvou výše uvedených metod nevrátí přizpůsobený editor nebo značky, vytvoří se editor textových polí na listu vlastností. Zpočátku zobrazená textová hodnota je výsledkem volání metod public void setValue(Object) a public String getAsText(). Pokud je do textového editoru zadán nový řetězec při každém úhozu, vyvolá se metoda public void setAsText(String). Pokud metoda způsobí výjimku java.lang.IllegalArgumentException, zobrazí se zpráva o výjimce na stavovém řádku a hodnota se nepoužije. Pokud po stisknutí klávesy Enter v textovém editoru (nebo pokud jiná vlastnost v pohledu Vlastnosti získá fokus) nedojde k žádné výjimce, výsledek volání metody public Object getValue() se odešle jako argument metodě set popsané v deskriptoru vlastností.

Pro všechny java.beans.PropertyEditor se také musí specializovat metoda public String getJavaInitializationString(). Tato metoda vrací řetězec, který se používá ve zdrojovém kódu Java jako argument k metodě set deskriptoru vlastností. Tento řetězec by měl vrátit danou hodnotu a jakékoli typy uvedené v řetězci by měly být úplné a neměly by záviset na žádném příkazu k importu ve třídě, která se sestavuje. Pokud vaše BeanInfo specializuje třídu JRE šablony java.beans.SimpleBeanInfo, metoda není abstraktní a bude zděděna, aby vrátila "???". Nesmíte zapomenout ji správně specializovat.

Kromě použití metody public String[] getTags() u deskriptoru vlastností k získání seznamu existuje rychlejší způsob určení seznamu hodnot. Vytvoří se hodnota atributu s klíčem enumerationValues, která je polem ztrojených položek displayName na seznamu, samotné hodnoty a initializationString. Jako příklad si vezměte vlastnost s názvem direction, která je zadána do int a mohou jí být přiřazeny hodnoty 0,1, 2 a 3. Jedná se o odkazy na statická pole NORTH, EAST, SOUTH, a WEST na třídě myclasses.CompassPoint. Deskriptor vlastností lze zapsat následujícím způsobem:

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;
}

Druhá hodnota u každé z položek není samotné statické pole int, jako např. myclasses.CompoassPoint.NORTH, ale jedná se o instanci java.lang.Integer. Důvodem je to, že primitivní typy nelze vkládat do pole, které je zapsáno do položky Object, a proto je nutno použít jejich java.lang equivalent.

Události objektu Bean Info

Seznam událostí, který je zobrazen na objektu Java bean, uvádí preferované deskriptory metod u deskriptorů událostí.

Pokud je k dispozici třída adaptéru, měla by se přidat do java.beans.EventDescriptor jako pojmenovaný atribut s klíčem "eventAdapterClass", například

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. Všechna práva vyhrazena.