Zdarzenia, obiekty nasłuchiwania oraz klasy adaptacyjne

Zdarzenia komponentów Java Bean są sygnalizowane w przypadku wystąpienia działania, na przykład naciśnięcia przycisku lub zamknięcia okna. Edytor Visual Editor for Java wyświetla widok komponentów Java Bean, w którym można dodawać i usuwać zdarzenia.

Lista zdarzeń zdefiniowanych dla komponentu Java Bean jest opisana w jego klasie BeanInfo, która steruje także często używanymi lub preferowanymi zdarzeniami.

Dodanie zdarzenia do komponentu Java Bean może mieć na celu wywołanie określonego działania w momencie wygenerowania tego komponentu, na przykład zaktualizowania bazy danych po naciśnięciu przycisku. Komponent Java Bean zgłaszający zdarzenie jest źródłem, a obiekt wywoływany w wyniku zgłoszenia zdarzenia - funkcją nasłuchiwania. Każdy komponent Java Bean ma interfejs, który umożliwia powiadamianie funkcji nasłuchiwania o każdym zdarzeniu, oraz metody służące do dodawania i usuwania funkcji nasłuchiwania.

Zwykle dla komponentu Java Bean z metodą XXX istnieje interfejs funkcji nasłuchiwania (XXXListener) i dwie metody. Istotne jest, aby interfejs XXXListener rozszerzał klasę java.util.EventListener. Jeśli tak nie jest i nie podano określonej klasy BeanInfo, zdarzenie nie zostanie wykryte.

Metody samego interfejsu XXXListener zależą od semantyki zdarzenia, ale ich sygnatura to zwykle void <nazwaMetodyWystąpieniaZdarzenia>(<TypObiektuStanuZdarzenia> evt);. Istotne jest, aby interfejs XXXListener rozszerzał klasę java.util.EventObject. Jeśli tak nie jest i nie podano określonej klasy BeanInfo, zdarzenie nie zostanie wykryte.

Przykładem zdarzenia jest klasa Java Bean java.awt.Component, która zgłasza zdarzenie, gdy nad komponentem znajdzie się wskaźnik myszy. Interfejs nasłuchiwania java.awt.event.MouseMotionListener implementuje następujące dwie metody:

Aby dodać funkcję nasłuchiwania dla zachowania wskaźnika myszy, komponent java.awt.Component ma dwie następujące metody:

Drugi styl zdarzenia jest generowany przez komponent Java Bean w momencie zmiany wartości właściwości, na przykład właściwości enabled w klasie javax.swing.JButton. Właściwość, której zmiana wartości wywołuje zdarzenie, jest nazywana właściwością powiązaną. Oprócz osobnego interfejsu nasłuchiwania dla każdej właściwości powiązanej istnieje ogólny interfejs nasłuchiwania (java.beans.PropertyChangeListener), który ma jedną metodę wywołania zwrotnego - void propertyChanged(PropertyChangeEvent evt);. Argument PropertyChangeEvent ma trzy metody, które mogą być sprawdzane przez odbiornik:  

String getPropertyName() Nazwa właściwości, której zmiana w komponencie Java Bean wywołała zdarzenie.
Object getNewValue() Nowa wartość właściwości.
Object getOldValue() Wartość właściwości przed zmianą.

Istnieją dwie metody służące do rejestrowania nasłuchiwania zmian właściwości komponentu Java Bean: void addPropertyChangeListener(PropertyChangeListener listener); i void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);.

Pierwsza z nich jest zawsze obecna w komponencie Java Bean, który ma właściwości powiązane. Druga jest natomiast opcjonalna i zależy od stylu rejestracji zdarzenia używanego przez autora komponentu Java Bean. Na przykład komponenty używają pierwszego stylu rejestracji zmian właściwości, natomiast komponenty Swing używają obu stylów.

Użycie zdarzenia umożliwiają trzy obiekty:

  1. Komponent Java Bean, który zgłasza zdarzenie (źródło).
  2. Klasa odbierająca powiadomienie ze źródła (funkcja nasłuchiwania).
  3. Klasa implementująca logikę uruchamianą w wyniku zwrotnego wywołania funkcji nasłuchiwania.

Zwykle dwa ostatnie z nich są połączone, dzięki czemu klasa wykonująca logikę implementuje interfejs nasłuchiwania bezpośrednio lub przez klasę wewnętrzną. Style kodu rozpoznawanego i generowanego przez edytor Visual Editor for Java opisano w sekcji dotyczącej generowania kodu zdarzeń.

Klasy adaptera

Wiele interfejsów nasłuchiwania ma więcej niż jedną metodę wywołania zwrotnego. Na przykład klasa java.awt.FocusListener ma dwie metody: focusGained(java.awt.FocusEvent event) i focusLost(java.awt.FocusEvent event). Podczas tworzenia klasy nasłuchiwania implementującej interfejs kompilator Java próbuje wdrożyć wszystkie metody interfejsu, co często powoduje powstanie wielu pustych metod i tylko jednej lub kilku faktycznie zawierających kod. W poniższym przykładzie klasa FocusListener służy do wykonania określonej logiki po aktywowaniu komponentu Java Bean. Wymagane jest jednak także określenie pustej metody focusLost.

javaBean.addFocusListener(new java.awt.event.FocusListener() {      
    public void focusGained(java.awt.event.FocusEvent e) {          
        doFocusGainedCode();      
     }          
        public void focusLost(java.awt.event.FocusEvent e) {      
     }  
});

Tworzenia wielu pustych metod nasłuchiwania dla wielu interfejsów nasłuchiwania można uniknąć dzięki klasom adaptera. Klasy te implementują interfejs nasłuchiwania i udostępniają pustą implementację jego metod bez operatora. Dzięki temu interfejs nasłuchiwania może je rozszerzyć i być specjalizacją wybranych metod, bez konieczności określania implementacji domyślnych dla reszty metod (są one dziedziczone z klasy adaptera).

javaBean.addFocusListener(new java.awt.event.FocusAdapter() {     
     public void focusGained(java.awt.event.FocusEvent e) {          
         doFocusGainedCode();      
         }  
   });
Czynności pokrewne
Wyświetlanie zdarzeń dla komponentu
Dodawanie zdarzeń do komponentu
Usuwanie zdarzeń z komponentu
Wyświetlanie kodu źródłowego dla zdarzenia

(C) Copyright IBM Corporation 1999, 2004. Wszelkie prawa zastrzeżone.