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