事件、接聽器和配接器類別

只要某一個活動進行時(例如,按某個按鈕或者關閉視窗),就會產生 JavaBean 事件。Java 視覺化編輯器會在 Java Bean 視圖中顯示事件,您可以使用這個視圖來新增和移除事件。

JavaBean 的定義事件清單,將在其 BeanInfo 類別中加以說明,它也可以控制常用或偏好的事件。

如果您希望在產生 JavaBean 時,發生什麼動作(例如,在按某個按鈕時更新資料庫),可以在 JavaBean 加入事件。 產生事件的 Java Bean 是來源,而在產生事件時被回呼的物件,則是接聽器。每一個 JavaBean 都有一個介面, 可讓它把每一個事件以及要新增和移除接聽器的方法,通知接聽器。

通常,如果來源 JavaBean 有一個 XXX 方法,則表示有一個接聽器介面、XXXListener 和兩個方法。XXXListener 一定要繼承 java.util.EventListener。 如果沒有,則除非提供特定的 BeanInfo,否則就不會發現事件。

XXXListener 介面本身的方法會隨著事件的語意而不同,但通常它們的簽章是 void <eventOccurenceMethodName>(<EventStateObjectType> evt);。XXXListener 一定要繼承 java.util.EventObject。 如果沒有,則除非提供特定的 BeanInfo,否則就不會發現事件。

JavaBean java.awt.Component 就是一個事件範例,它會在滑鼠移到上面時產生事件。 接聽器介面 java.awt.event.MouseMotionListener 可實作下面兩個方法:

java.awt.Component 有下面兩種方法可以新增滑鼠接聽器:

事件的第二個樣式是在內容值變更時,由 JavaBean 所產生。javax.swing.JButton 的 'enabled' 內容即為一例。 如果內容在其值變更時發動事件,這個內容就是一個界限內容。 每個界限內容並未各自擁有個別接聽器介面,它們共用含有單一回呼方法 void propertyCanged(PropertyChangeEvent evt); 的通用接聽器介面 java.beans.PropertyChangeListener。PropertyChangeEvent 引數有三個可供方法接收者查詢的方法:

String getPropertyName() 在 JavaBean 上變更的內容名稱,也因此而發動事件
Object getNewValue() 內容的新值
Object getOldValue() 變更之前的內容值

您可以利用兩種方法來登錄需要 JavaBean 內容的變更:void addPropertyChangeListener(PropertyChangeListener listener); void addPropertyChangeListener(String propertyName, PropertyChangeListener listener);

第一個方法是一律呈現在具有界限內容的 JavaBean。 但是,第二個方法是選用性的方法,必須根據 JavaBean 作者所用的事件登錄樣式而定。 比方說,AWT 元件是採用內容變更登錄的第一個樣式,而 Swing 元件則兩者都採用。

您可以利用下列三個物件來使用事件:

  1. 產生事件的 JavaBean(來源)
  2. 從來源接收通知的類別(接聽器)
  3. 實作在接聽器被回呼時所發生之邏輯的類別。

通常後面兩者會組合起來,讓執行邏輯的類別直接實作接聽器介面,或者使用內部類別。Java 視覺化編輯器所辨識和產生的程式碼樣式,將在「產生事件碼」一節中加以說明。

配接器類別

許多接聽器介面都有不只一個回呼方法。 以 java.awt.FocusListener 為例,它就有兩個方法; focusGained(java.awt.FocusEvent 事件)和 focusLost(java.awt.FocusEvent 事件)。 在建立實作介面的接聽器類別時,Java 編譯器堅持所有的介面方法都要實作, 此舉通常會建立許多空的方法來滿足它的需求,而事實上只有其中一或部分方法含有程式碼。 下面這個陳述式所示的是,在 Java Bean 成為作用中時,利用 FocusListener 來執行部分邏輯。 但是,空的 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) {      
     }  
});

為了避免許多接聽器產生許多空的接聽器方法,因此提供配接器類別。它們會實作接聽器介面,提供其方法的空 no-op 實作。 其優點是接聽器可以繼承它們,而且只將所選的方法特殊化,不必為其他方法提供預設實作(這些是繼承自配接器)。

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

視覺化編輯器可以辨識並且使用配接器類別, 而 BeanInfo 事件一節將說明,如何將自己事件的配接器類別,關聯到視覺化編輯器。

母主題: 利用視覺化編輯器來處理事件

(C) Copyright IBM Corporation 1999, 2004. All Rights Reserved.