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