【正文】
e s t orE ve nt e ve nt )a nc e s t orRe m ove d(A nc e s t orE ve nt e ve nt )Ca re Ca re t L i s t e ne r c a re t U p da t e (Ca re t E ve nt )Cha ng e Cha ng e L i s t e ne r s t a t e Cha ng e d(Cha ng e E ve nt )W i ndo w W i ndo w L i s t e ne rCont a i ne r Cont a i ne rL i s t e ne rA nc e s t or A nc e s t orL i s t e ne r成都信息工程學院 管理學院 鄒靳 62 常用事件類型及接口 事件類別 i n te r fac e 名稱 方法c ha ng e dU p da t e (D oc um e nt E ve nt )i ns e rt U p da t e (D oc um e nt E ve nt )re m ove U p da t e (D oc um e nt E ve nt )U ndo a bl e E di t U ndo a bl e E di t L i s t e ne r und oa bl e E di t H a p p e ne d(U ndo a bl e E di t E ve nt )L i s t S e l e c t i on L i s t S e l e c t i onL i s t e ne r va l ue Cha ng e d(L i s t S e l e c t i onE ve nt )T a bl e M ode l T a bl e M ode l L i s t e ne r t a bl e Cha ng e d(T a bl e M ode l E ve nt )t re e Col l a p s e d(T re e E x p a ns i onE ve nt )t re e E x p a nde d(T re e E x p a ns i onE ve nt )t re e W i l l Col l a p s e (T re e E x p a ns i onE ve nt )t re e W i l l E x p a nd(T re e E x p a ns i onE ve nt )t re e N ode s Cha ng e d(T re e M ode l E ve nt )t re e N ode s Ins e rt e d(T re e M ode l E ve nt )t re e N ode s Re m ove d(T re e M ode l E ve nt )t re e N ode s S t ruc t ure Cha ng e d(T re e M ode l E ve nt )T re e S e l e c t i on T re e S e l e c t i onL i s t e ne r va l ue Cha ng e d(T re e S e l e c t i onE ve nt )D oc um e nt D oc um e nt L i s t e ne rT re e E x p a ns i on T re e E x p a ns i onL i s t e ne rT re e W i l l E x p a nd T re e W i l l E x p a ndL i s t e ne rT re e M ode l T re e M ode l L i s t e ne r成都信息工程學院 管理學院 鄒靳 63 例子 ? 程序?qū)z測鼠標的拖動(即按住鼠標鍵并同時移動鼠標的操作)以及鼠標進入和離開窗口的情況 ? TwoListener類同時實現(xiàn) MouseMotionListener和 MouseListener兩個接口 ? 監(jiān)聽多類事件 ? 獲取事件的細節(jié) ? 程序 716 (this); (this); 成都信息工程學院 管理學院 鄒靳 64 多監(jiān)聽程序 ? 事件監(jiān)聽模式允許為一個組件注冊多個監(jiān)聽程序 ? 允許根據(jù)需要多次調(diào)用 addListener方法為某個組件的同一事件注冊多個不同的監(jiān)聽程序,當事件發(fā)生時,所有相關(guān)的監(jiān)聽程序都會被調(diào)用 ? 當事件發(fā)生時,單個事件的多個監(jiān)聽程序的調(diào)用順序是不確定的 ? 如果在某個程序中,各個監(jiān)聽程序的調(diào)用順序很重要,那么它們之間就不是不相關(guān)的,在這種情況下,你就不能再為同一事件注冊多個監(jiān)聽程序,而是只注冊唯一一個監(jiān)聽程序,然后再在該監(jiān)聽程序中調(diào)用所需的其他方法 成都信息工程學院 管理學院 鄒靳 65 事件處理的代碼風格 ? 內(nèi)部類方式 ? 用應(yīng)用程序本身充當動作事件的監(jiān)聽者 ? 將監(jiān)聽者的設(shè)置及處理都放在addActionListener的參數(shù)表中 成都信息工程學院 管理學院 鄒靳 66 事件適配器 ? 為了進行事件處理,我們需要創(chuàng)建實現(xiàn)Listener接口的類,而某些 Listener接口中,聲明了很多抽象方法,為了實現(xiàn)這些接口,我們需要一一實現(xiàn)這些方法 ? 為了編程方便, Java為一些聲明了多個方法的 Listener接口提供了相對應(yīng)的適配器( Adapter) 類,在適配器類中實現(xiàn)了相應(yīng)接口中的全部方法,只是方法的內(nèi)容為空 MouseListener接口 public interface MouseListener extends EventListener { public void mouseClicked(MouseEvent e); public void mousePressed(MouseEvent e); public void mouseReleased(MouseEvent e); public void mouseEntered(MouseEvent e); public void mouseExited(MouseEvent e); } 適配器 MouseAdapter: public abstract class MouseAdapter implements MouseListener { public void mouseClicked(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} } 在創(chuàng)建新類時, 就可以不實現(xiàn)接 口,而是只繼 承某個適當?shù)? 適配器,并且重 載關(guān)心的事件 處理方法 成都信息工程學院 管理學院 鄒靳 67 使用適配器的例子 import .*; import .*; import .*; public class MouseClickHandler extends MouseAdapter { // 我們只關(guān)心對單擊鼠標事件的處理,因此在這里繼承 // MouseAdapter, 以避免編寫其他不需要的事件處理方法 public void mouseClicked(MouseEvent e) { // 進行有關(guān)的處理 } } 成都信息工程學院 管理學院 鄒靳 68 接口及適配器 接口名稱 適配器名稱Co m p one nt L i s t e ne r Co m p one nt A da p t e rCo nt a i ne rL i s t e ne r Co nt a i ne rA da p t e rF oc us L i s t e ne r F oc us A da p t e rK e y L i s t e ne r K e y A da p t e rM ous e L i s t e ne r M ous e A da p t e rM ous e M ot i onL i s t e ne r M ous e M ot i onA da p t e rM ous e In p ut L i s t e ne r M ous e In p ut A da p t e rW i ndo w L i s t e ne r W i ndo w A da p t e r69