閱讀779 返回首頁    go 阿裏雲 go 技術社區[雲棲]


JAVA 監聽器與適配器 小小的分析

監聽器和適配器是Java圖形用戶界麵(GUI,Graphics User interface)設計的抽象窗口工具集(AWT,Abstract Window Toolkit)的兩個重要概念,他們都在java.awt包中。JDK1.1引入了委托事件模型,監聽器和適配器就是這一模型的具體實現,所以理解他們就變得非常重要,初學者可能對於這兩個概念有點陌生,為了節省他們看長編大論再自己總結的時間,我在這裏就把自己的理解寫出來,拋磚引玉。

1.委托事件模型
         要理解監聽器和適配器,那麼一定要了解委托事件模型,它區別於層次事件模型(JDK1.1以前的Java標準),根據不同的用戶操作,產生不同的事件(Event類),並為每個事件類定義了事件對象的接受和處理方法,這些方法都包括在我們的監聽器(Listener Interfance)裏麵,我們注冊相應的事件監聽程序後,就可以接受事件對象,實現相應的方法。

2.監聽器和適配器是什麼?
         如果一個類裏聲明了抽象方法,那麼它也必須聲明為抽象的。換句話說,包含有抽象方法的類就是抽象類。
         如果一個類裏麵的方法都是抽象的,那麼它就是一個接口,也就是說,接口是一種特殊的抽象類。(當然,抽象類跟接口是有區別的,本文並不深入討論這個問題)
         事件的監聽程序(Listener)是接口中的一個未實現的方法。
         很明顯,監聽器實質上就是一個接口(Interface)。
         適配器(Adapter)是跟監聽器一一對應的類。它實現了對應監聽器中的所有方法,但都是空方法。注意:適配器是一個抽象類(abstract class)

3.適配器和監聽器的使用
        在實際使用中,適配器隻是作為方便程序員編程的一個手段,一般情況下程序員都要重寫適配器中某些需要的方法,以達到所要的功能,如果隻是一個適配器,那麼它什麼也不幹。
        當然你也完全可以不用適配器,自己把監聽器裏麵的方法全寫一遍,那麼在功能上是沒什麼不同的。也就是說有兩種完成的方式:
①需要注冊監聽程序的類實現接口(監聽器),然後重寫接口中的所有方法
②需要注冊監聽程序的類實現接口(監聽器),然後繼承適配器,再重寫需要的方法

4.需要注意的地方
  Ⅰ 有些教材把事件監聽程序(Listener)等同於監聽器(Listener Interface),本人覺得它們應該是接口中的方法與接口的關係,另外也有人把監聽器稱為監聽者。
         Ⅱ 監聽器是接口,是需要實現(implements)的,適配器是抽象類,是需要繼承(extends)的。而由於適配器已經實現了對應的監聽器,故繼承了適配器的類不用再聲明實現對應的監聽器,就可以注冊對應的監聽程序。
例如:public class Calc1 extends WindowAdapter implements ActionListener,ItemListener
             {
                 Frame f;
                 TextField tf1;
                 Checkbox cb1;
                  ……
                 public void display()
                  {
                     ……
                     tf1.addActionListener(this); //實現了ActionListener,故可以注冊對應的ActionListener
                     cb1.addItemListener(this); //實現了ItemListener,故可以注冊對應ItemListener
                     f.addWindowListener(this);    //繼承了WindowAdapter,也可以注冊對應的WindowListener
                     ……
                   }

                  ……
              }  

  Ⅲ 在實際使用中,由於Java隻能單繼承,對於接口和抽象類的選擇就需慎重考慮,同樣的一個類隻能繼承一個適配器,這也意味著其它的監聽程序就需要手動實現,在優秀的編輯工具下這個工作量也許並不大,但也可以嚐試把監聽器交給別的類(比如類A)來實現,而類A就可以繼承對應的適配器,這才是Java的單繼承多接口機製的思想所在。



最後更新:2017-04-02 22:16:31

  上一篇:go cygwin完整版下載地址
  下一篇:go android make常見錯誤