Wskazówki dotyczące pisania klas BeanInfo w edytorze elementów wizualnych

Ta sekcja zawiera opis reguł, które można stosować podczas pisania klasy BeanInfo dla komponentu Java Bean przeznaczonego do użycia w edytorze Visual Editor for Java.

Edytor Visual Editor for Java korzysta z deskryptorów właściwości opisanych w klasie BeanInfo w celu ustalenia listy pozycji w widoku Właściwości oraz sposobu ich edytowania.

Jeśli klasa java.beans.PropertyDescriptor jest ukryta, nie będzie dostępna w przeglądarce właściwości. Metody ustawiania ukrytych właściwości będą mimo tego analizowane przez generator kodu i stosowane do aktywnych komponentów Bean.

Ukryte właściwości są używane przez analizator kodu, ale nie są widoczne w innych widokach i funkcjach edytora elementów wizualnych. Program VisualAge for Java umożliwiał wykluczanie właściwości z widoku Właściwości, ale nie blokowanie dostępu do niej z innych funkcji, na przykład tworzenia połączeń przez ustawianie ich w czasie projektowania na false. Edytor Visual Editor for Java nie może tworzyć połączeń, ale nadal korzysta z pojęcia właściwości czasu projektowania. Aby ustawić właściwość czasu projektowania jako fałsz, należy zmienić wartość atrybutu klucza ivjDesignTimeProperty na Boolean.FALSE.

Na przykład jeśli klasa BeanInfo jest zapisywana dla klasy MyJavaBean mającej właściwość name (pochodzącą z metod public void setName(String) i public String getName()), metodę getPropertyDescriptors() można zapisać następująco:

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

Wybranie właściwości w widoku Właściwości powoduje otwarcie edytora w kolumnie Wartość, w którym można wprowadzić nową wartość. W celu określenia typu edytora dla właściwości generowane jest odpowiednie zapytanie do klasy java.beans.PropertyDescriptor. Jeśli powiązany edytor właściwości zostanie znaleziony, jest używany. W przeciwnym razie wyszukiwany jest edytor odpowiedni dla typu właściwości. Listy predefiniowanych edytorów właściwości dla typów nie można zmieniać. Jeśli w deskryptorze właściwości lub typie właściwości zostanie znaleziona klasa java.beans.PropertyEditor, widok Właściwości spróbuje określić typ edytora do utworzenia. Stosowane są przy tym następujące reguły:

  1. Jeśli metoda public boolean supportsCustomEdit() zwraca wartość true, edytor jest tworzony. Przycisk okna dialogowego uruchamia edytor zwrócony przez metodę public Component getCustomEditor(). Zwrócony edytor powinien być podklasą klasy java.awt.Component i jest udostępniany za pośrednictwem przycisków OK i Anuluj w warstwie Frame lub JFrame (zależnie od wymagań).
  2. Jeśli metoda public String[] getTags() zwraca tablicę łańcuchów, są one wyświetlane na liście. Etykieta stosowana dla istniejącej wartości w widoku Właściwości jest ustalana przez wywołanie metody public void setValue(Object) z wartością właściwości, a następnie metody public String getAsText() w celu określenia odpowiedniego łańcucha, który ma zostać użyty. Wybranie nowej wartości z listy powoduje wywołanie nowej metody edytora public void setAsText(String) i pobranie nowej wartości właściwości przy użyciu metody public Object getValue().
  3. Jeśli żadna z powyższych metod nie zwróci niestandardowego edytora lub znaczników, w arkuszu Właściwości tworzony jest edytor mający postać pola tekstowego. Początkowo wyświetlany tekst to wartość zwracana przez wywołanie metod public void setValue(Object) i public String getAsText(). Każde naciśnięcie klawisza w czasie wprowadzania nowego łańcucha w edytorze pola tekstowego powoduje wywołanie metody public void setAsText(String). Jeśli ta metoda zgłasza wyjątek java.lang.IllegalArgumentException, na pasku statusu jest wyświetlany komunikat o błędzie, a wartość nie jest stosowana. Jeśli wyjątek nie zostanie zgłoszony, w wyniku naciśnięcia klawisza Enter w edytorze pola tekstowego (lub aktywowania innej właściwości w widoku właściwości) rezultat wywołania metody public Object getValue() jest wysyłany jako argument do metody set opisanej w deskryptorze właściwości.

Dla każdej klasy java.beans.PropertyEditor należy utworzyć także specjalizację metody public String getJavaInitializationString(). Zwrócony łańcuch jest używany w kodzie źródłowym Java jako argument metody set deskryptora właściwości. Łańcuch powinien zwrócić wartość, a wszelkie typy w nim przywoływane powinny być w pełni określone i nie powinny polegać na instrukcjach importu w tworzonej klasie. Jeśli klasa BeanInfo jest specjalizacją klasy szablonowej środowiska JRE java.beans.SimpleBeanInfo, metoda nie jest abstrakcyjna i w wyniku dziedziczenia zwróci wartość ???. Należy pamiętać o poprawnym utworzeniu specjalizacji klasy szablonowej.

Istnieje prostszy sposób określania listy wartości, niż jej pobieranie przez zastosowanie metody public String[] getTags() względem deskryptora właściwości. Wartość atrybutu jest tworzona z kluczem enumerationValues. Jest to tablica powielonych potrójnie wpisów: displayName na liście, samej wartości oraz łańcucha initializationString. Na przykład właściwość o nazwie direction (typu int) może mieć przypisane wartości 0, 1, 2 i 3. Wartości te stanowią odwołania do pól static NORTH, EAST, SOUTH i WEST w klasie myclasses.CompassPoint. Deskryptor tej właściwości można zapisać następująco:

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

Druga wartość każdego z wpisów nie jest samym polem int static (np. myclasses.CompoassPoint.NORTH), ale instancją klasy java.lang.Integer. Wynika to z faktu, że typy podstawowe nie mogą być umieszczane w tablicy typu Object, a więc użyty musi zostać odpowiedni dla nich obiekt java.lang equivalent.

Zdarzenia klas Bean Info

Lista zdarzeń wyświetlana dla komponentu Java Bean to preferowane deskryptory metody dla jej deskryptorów zdarzeń.

Jeśli klasa adaptera jest dostępna, należy ją dodać do klasy java.beans.EventDescriptor jako nazwany atrybut o kluczu eventAdapterClass, na przykład:

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. Wszelkie prawa zastrzeżone.