Ötletek vizuális szerkesztő BeanInfo osztályok írásához

Ez a szakasz olyan szabályokat tartalmaz, melyeket érdemes betartani a Visual Editor for Java környezetbe szánt Java komponensek BeanInfo osztályainak megírásakor.

A Visual Editor for Java a BeanInfo osztály tulajdonságleírói alapján állítja össze a Tulajdonságok nézet bejegyzéseit, illetve állapítja meg ezek szerkesztésének módját.

Ha egy java.beans.PropertyDescriptor rejtett, akkor a hozzá tartozó tulajdonság nem elérhető a Tulajdonságok megjelenítőben. Mindazonáltal a kód előállító a rejtett tulajdonságok beállító metódusait is feldolgozza, így azok bekerülnek az élő komponensbe.

A rejtett tulajdonságokat a kódértelmező felhasználja, de a vizuális szerkesztő többi nézete vagy szolgáltatása számára nem elérhetőek. A VisualAge for Java lehetővé tette egy tulajdonság kizárását a Tulajdonságok nézetből úgy, hogy az továbbra is rendelkezésre álljon a többi funkció számára. Ilyen például a csatlakozás, amely tervezési időben false értékre állítható. Noha a vizuális szerkesztő nem rendelkezik csatlakozási képességgel, a tervezési idejű tulajdonságok elvét átörökíti. Egy tulajdonság tervezési időben hamisra állításához hozzon létre egy ivjDesignTimeProperty jellemzőt Boolean.FALSE értékkel.

Tegyük fel például, hogy a SajatJavaBean osztályhoz készít BeanInfo osztályt, amely a public void setName(String) és public String getName() metóduspáron alapuló name tulajdonsággal rendelkezik. Ekkor a getPropertyDescriptors() metódus lehet a következő:

public PropertyDescriptor[] getPropertyDescriptors() {
    PropertyDescriptor[] eredmeny = new PropertyDescriptor[1];
    try{
        PropertyDescriptor iranyLeiro = new
PropertyDescriptor("irány",SajatJavaBean.class);
        iranyLeiro.setValue("enumerationValues",new
Object[]{
            "Észak",new
Integer(sajatosztalyok.IranytuMutat.ESZAK),"sajatosztalyok.IranytuMutat.ESZAK",

            "Kelet",new
Integer(sajatosztalyok.IranytuMutat.KELET),"sajatosztalyok.IranytuMutat.KELET",

            "Dél",new
Integer(sajatosztalyok.IranytuMutat.DEL),"sajatosztalyok.IranytuMutat.DEL",

            "Nyugat",new
Integer(sajatosztalyok.IranytuMutat.NYUGAT),"sajatosztalyok.IranytuMutat.NYUGAT"
        });
        eredmeny[0] = iranyLeiro;
    } catch ( IntrospectionError exc ) {
    }
    return eredmeny;
}

Amikor kijelöl egy tulajdonságot a Tulajdonságok nézetben, akkor az Érték oszlopban egy szerkesztő jön létre, amelyben megadhatja az új értéket. A megfelelő tulajdonságszerkesztőt a vizuális szerkesztő a java.beans.PropertyDescriptor alapján kísérli meg meghatározni. Ha talál a tulajdonsághoz tartozó szerkesztőt, akkor azt használja. Ellenkező esetben a tulajdonságtípushoz tartozó alapértelmezett szerkesztőt keresi meg. Az előre meghatározott tulajdonságszerkesztők listáját nem lehet módosítani. Ha a tulajdonságleíró vagy a tulajdonságtípus alapján a java.beans.PropertyEditor meghatározható, akkor a Tulajdonságok nézet megkísérli meghatározni a létrehozandó szerkesztő típusát. A szabályok a következők:

  1. Ha a public boolean supportsCustomEdit() metódus visszatérési értéke true, akkor szerkesztő párbeszédablak jön létre. A gomb a public Component getCustomEditor() által visszaadott szerkesztőt nyitja meg. A visszaadott szerkesztőnek a java.awt.Component osztályból kell származnia, és a megjelenő párbeszédablak rajta kívül tartalmazni fog egy OK és egy Mégse gombot is, szükség szerint Frame vagy JFrame keretben.
  2. Ha a public String[] getTags() metódus egy karaktersorozat típusú tömbbel tér vissza, akkor ennek elemei egy listában jelennek meg. Egy meglévő érték Tulajdonságok nézetben megjelenő címkéjének előállításához a vizuális szerkesztő először meghívja a public void setValue(Object) metódust a tulajdonságértékkel, majd a public String getAsText() metódussal segítségével megállapítja a használandó String értéket. Ha a felhasználó egy új elemet választ ki a listában, akkor a szerkesztő a public void setAsText(String) metódust hívja meg, az új tulajdonságértéket pedig a public Object getValue() metódussal kérdezi le.
  3. Ha a fenti metódusok egyike sem ad vissza egyéni szerkesztőt vagy címkét, akkor a Tulajdonságok lapon egy szöveges beviteli mező jön létre. A mező kezdeti tartalmát egy public void setValue(Object) és public String getAsText() hívás határozza meg. Ahogyan a felhasználó begépeli az új értéket, a szövegmező minden billentyűleütésnél meghívja a public void setAsText(String) metódust. Ha a metódus java.lang.IllegalArgumentException kivételt dob, akkor a kivétel szövege megjelenik az állapotsoron, és az érték nem kerül alkalmazásra. Ha nem keletkezik kivétel, és a felhasználó lenyomja az Enter billentyűt, vagy a fókusz egy másik tulajdonságra kerül, akkor a szerkesztő a public Object getValue() hívás visszatérési értékével meghívja a tulajdonságleíró által meghatározott beállító metódust.

Minden egyes java.beans.PropertyEditor osztálynak specializálni kell a public String getJavaInitializationString() metódusát. Ez visszaadja a Java forráskódban a tulajdonságleíró set metódusának argumentumaként használt karaktersorozatot. Ennek a karaktersorozatnak kell visszaadnia az értéket. A karakterlánc csak teljes képzésű típushivatkozásokat tartalmazhat, és nem hagyatkozhat az összeállítás alatt álló osztály importálási utasításaira. Ha a BeanInfo osztály a java.beans.SimpleBeanInfo JRE sablonosztályt specializálja, akkor a metódus nem absztrakt, és a leszármazott metódus visszatérési értéke '???'. Ne feledje helyesen megvalósítani a specializációt.

A public String[] getTags() metódus meghívásánál egyszerűbb módszer is létezik az értékek listájának összeállítására. Az enumerationValues attribútumérték egy tömb, melynek elemei három bejegyzést tartalmaznak: a listában megjelenő nevet (displayName), magát az értéket, és az initializationString karakterláncot. Tegyük fel például, hogy az irany tulajdonság típusa int, és lehetséges értékei 0,1, 2 és 3. Ezek hivatkozások a sajatosztalyok.IranytuMutat ESZAK, DEL, KELET és NYUGAT statikus mezőire. A tulajdonság a leírója a következő:

public PropertyDescriptor[] getPropertyDescriptors() {
    PropertyDescriptor[] eredmeny = new PropertyDescriptor[1];
    try{
        PropertyDescriptor iranyLeiro
= new PropertyDescriptor("direction",MyJavaBean.class);
        iranyLeiro.setValue("enumerationValues",new
Object[]{

"Észal",new
Integer(sajatosztalyok.IranytuMutat.ESZAK),"sajatosztalyok.IranytuMutat.ESZAK",

"Kelet",new
Integer(sajatosztalyok.IranytuMutat.KELET),"sajatosztalyok.IranytuMutat.KELET",

"Dél",new
Integer(sajatosztalyok.IranytuMutat.DEL),"sajatosztalyok.IranytuMutat.DEL",

"Nyugat",new
Integer(sajatosztalyok.IranytuMutat.NYUGAT),"sajatosztalyok.IranytuMutat.NYUGAT"
        });
        eredmeny[0] = iranyLeiro;
    } catch ( IntrospectionError exc ) {
    }
    return eredmeny;
}

A bejegyzésekben a második érték nem maga a statikus int mező (például sajatosztalyok.IranytuMutat.NYUGAT), hanem egy java.lang.Integer példány. Ez azért van így, mert primitív típusok nem tárolhatók Object típusú tömbben, ezért a java.lang megfelelőjüket kell használni.

BeanInfo események

A Java komponenshez megjelenített események az eseményleíróihoz rendelt metódus leírók.

Ha elérhető illesztőosztály, akkor megnevezett attribútumként "eventAdapterClass" kulccsal adja hozzá a java.beans.EventDescriptor-hoz, például:

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. Minden jog fenntartva.