<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 51, comments - 17, trackbacks - 0, articles - 9
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    java 事件機制

    Posted on 2007-04-13 09:22 chenweicai 閱讀(10338) 評論(14)  編輯  收藏

    java中的事件機制的參與者有3種角色:

    1.event object:就是事件產生時具體的“事件”,用于listener的相應的方法之中,作為參數,一般存在與listerner的方法之中

    2.event source:具體的接受事件的實體,比如說,你點擊一個button,那么button就是event source,這樣你必須使button對某些事件進行相應,你就需要注冊特定的listener,比如說MouseEvent之中的MouseClicked方法,這是他就必須有了add方法

    3.event listener:具體的對監聽的事件類,當有其對應的event object產生的時候,它就調用相應的方法,進行處理。在windows程序設計里邊這種相應使用callback機制來實現的

    先看看jdk提供的event包:
    public interface EventListener:所有事件偵聽器接口必須擴展的標記接口。
    public class EventObject extends Object implements Serializable

    所有事件狀態對象都將從其派生的根類。 所有 Event 在構造時都引用了對象 "source",在邏輯上認為該對象是最初發生有關 Event 的對象。

            在Java2處理事件時,沒有采用dispatchEvent()-postEvent()-handleEvent()方式,采用了監聽器類,每個事件類都有相關聯的監聽器接口。事件從事件源到監聽者的傳遞是通過對目標監聽者對象的Java方法調用進行的。

      對每個明確的事件的發生,都相應地定義一個明確的Java方法。這些方法都集中定義在事件監聽者(EventListener)接口中,這個接口要繼承 java.util.EventListener。 實現了事件監聽者接口中一些或全部方法的類就是事件監聽者。

      伴隨著事件的發生,相應的狀態通常都封裝在事件狀態對象中,該對象必須繼承自java.util.EventObject。事件狀態對象作為單參傳遞給應響應該事件的監聽者方法中。發出某種特定事件的事件源的標識是:遵從規定的設計格式為事件監聽者定義注冊方法,并接受對指定事件監聽者接口實例的引用。

    開始之前首先問個問題:您熟悉java.util.EventObject 和java.util.EventListener兩個類以及他們已有的子類嗎?

    如果你已經能夠熟練使用jdk為我們提供的事件監聽器,并且很熟悉MouseEvent, KeyEvent, WindowEvent等等這些jdk為我們準備好的事件,那么想必你對java的事件機制已經有所理解。但是也許你還是覺得雖然用起來沒什么問題,但是原理還是有些糊涂,那么下面我們再進一步自己實現這些事件和監聽器,我們把這個取名為自定義事件。

    其實自定義事件在java中很有用處,我們有的時候想讓自己的程序產生一個事件,但有不希望(或者不可能)用鼠標,鍵盤之類的輸入設備進行操作,比如你寫一個應用程序,在這個程序中一旦收到郵件就對郵件進行相關處理,對于“收到郵件”這個事件,jdk中就沒有定義。對于這樣的事件,以及對于這樣的事件的監聽器,我們只能自己動手完成了。

    那么下面就以實例開始我們這個“創新”的過程:首先,我們要明確jdk中需要的資源:類EventObject作為父類用來生成我們自己的事件類,接口EventListener用來實現我們自己的監聽器;剩下的事情就是如何注冊這些事件以及測試他們了。

    (1)       通過DemoEvent.java文件創建DemoEvent類,這個類繼承EventObject。這個類的構造函數的參數傳遞了產生這個事件的事件源(比如各種控件),方法getSource用來獲得這個事件源的引用。

    DemoEvent.java

    package demo.listener;

     

    import java.util.EventObject;

     

    public class DemoEvent extends EventObject

    {

            Object obj;

            public DemoEvent(Object source)

            {

                   super(source);

                   obj = source;

            }

            public Object getSource()

            {

                   return obj;

            }

            public void say()

            {

                   System.out.println("This is say method...");

            }

    }

     

    (2)       定義新的事件監聽接口,該接口繼承自EventListener;該接口包含對DemeEvent事件的處理程序:

    DemoListener.java

    package demo.listener;

     

    import java.util.EventListener;

     

    public interface DemoListener extends EventListener

    {

           public void demoEvent(DemoEvent dm);

    }

     

    通過上面的接口我們再定義事件監聽類,這些類具體實現了監聽功能和事件處理功能?;叵胍幌律衔闹心撬姆N實現方式,我們這里不正是使用了其中的第三種——外部類寫法的方式嗎?

    Listener1.java

    package demo.listener;

     

    public class Listener1 implements DemoListener

    {

           public void demoEvent(DemoEvent de)

           {

                  System.out.println("Inside listener1...");

           }

    }



    Listener2.java

    package demo.listener;

     

    public class Listener2 implements DemoListener

    {

           public void demoEvent(DemoEvent de)

           {

                  System.out.println("Inside listener2...");

           }

    }


    Listener3.java

    package demo.listener;

     

    public class Listener3 implements DemoListener

    {

           public void demoEvent(DemoEvent de)

           {

                  System.out.println("Inside listener3...");

           }

    }

     

    (3)       通過DemeSource..ava文件創造一個事件源類,它用一個java.utile.Vector對象來存儲所有的事件監聽器對象,存儲方式是通過addListener(..)這樣的方法。notifyDemeEvent(..)是觸發事件的方法,用來通知系統:事件發生了,你調用相應的處理函數(回調函數)吧。

    DemoSource.java

     

    package demo.listener;

    import java.util.*;

     

    public class DemoSource

    {

           private Vector repository = new Vector();

           DemoListener dl;

           public DemoSource()

           {

     

           }

           public void addDemoListener(DemoListener dl)

           {

                  repository.addElement(dl);

           }

           public void notifyDemoEvent()

           {

                  Enumeration enum = repository.elements();

                  while(enum.hasMoreElements())

                  {

                        dl = (DemoListener)enum.nextElement();

                        dl.demoEvent(new DemoEvent(this));

                  }

           }

    }

     

     

                 

    (4)       好了,最后寫一個測試程序測試一下我們自定義的事件吧,這段程序應該不難理解吧:)

    TestDemo.java

     

    package demo.listener;

     

    public class TestDemo

    {

           DemoSource ds;

     

           public TestDemo()

           {

                  try{

                        ds = new DemoSource();

                        Listener1 l1 = new Listener1();

                        Listener2 l2 = new Listener2();

                        Listener3 l3 = new Listener3();

     

                        ds.addDemoListener(l1);

                        ds.addDemoListener(l2);

                        ds.addDemoListener(l3);

                        ds.addDemoListener(new DemoListener(){
                                   public void demoEvent(DemoEvent event){
                                             System.out.println("Method come from 匿名類...");
                                   }
                           });

                        ds.notifyDemoEvent();

     

                  }catch(Exception ex)

                  {ex.printStackTrace();}

           }

     

           public static void main(String args[])

           {

                  new TestDemo();

           }

    }



    評論

    # re: java 事件機制  回復  更多評論   

    2007-09-29 15:33 by somesongs
    解惑啊,寫得非常好,謝謝。
    本來自己還想邊學邊寫,但無法超越了。呵呵。

    # re: java 事件機制  回復  更多評論   

    2007-12-18 13:40 by hondz
    還是有收獲的,但是例子倒是沒啥看明白,初學可能是水平太次了吧,DemoEvent對象在哪里創建的呢?如果在事件處理器中調用say方法會不會拋空指針異常?

    # re: java 事件機制  回復  更多評論   

    2007-12-18 14:03 by hondz
    不好意思了,在notify方法里面創建的,完全明白了,謝謝??!

    # re: java 事件機制  回復  更多評論   

    2008-01-21 11:33 by 盧劍鳴
    淺顯易懂!贊!

    # re: java 事件機制  回復  更多評論   

    2008-11-24 19:51 by 路段的
    鳳飛飛

    # re: java 事件機制  回復  更多評論   

    2008-12-12 17:20 by 鮑鮑
    不錯。謝謝樓主。

    # re: java 事件機制[未登錄]  回復  更多評論   

    2009-03-30 10:33 by abc
    Observer pattern

    # re: java 事件機制[未登錄]  回復  更多評論   

    2009-05-11 17:53 by neo
    恩 很好 贊一個

    # re: java 事件機制  回復  更多評論   

    2009-05-13 17:51 by 路人
    非常謝謝樓主!?。?!

    # re: java 事件機制  回復  更多評論   

    2009-08-11 20:10 by hermit
    這個例子還是有些問題的。主要是事件何時觸發應該是由 DemoSource 自身決定的,所以,事件源 DemoSource 的通知方法 notifyDemoEvent 一般是私有的方法,或者若你想 DemoSource 可以有子類,那么設成protected。也就是 notifyDemoEvent 應該由 DemoSource 在能夠發生DemoEvent 時自己來調用,而何時發生DemoEvent事件,是DemoSource 自身特點決定的,外部對象是不知道的。比如我們可以在 DemoEvent 中加一個屬性 demoValue,
    private int demoValue;
    public int getDemoValue() {
    return demoValue;
    }
    public void setDemoValue(int val) {
    this.demoValue = val;
    notifyDemoEvent(new DemoEvent(this));
    }
    這時,外部對象 TestDemo 可以調用 ds.setDemoValue(1),就使DemoSource 觸發了事件,并通知各個監聽器處理事件。外部對象 TestDemo 不應該調用 notifyDemoEvent 方法,它怎么知道什么時候應該發生 DemoEvent 事件呢?

    # re: java 事件機制  回復  更多評論   

    2009-09-04 10:24 by zzw
    嗯,樓上有理,樓主也寫的好

    # re: java 事件機制  回復  更多評論   

    2009-10-10 12:08 by 啊白
    受益了,感謝樓主

    # re: java 事件機制[未登錄]  回復  更多評論   

    2014-11-13 15:03 by scott
    樓主總體來說是不錯的,我就想問問你有沒有想過為什么要“DemoEvent extends EventObject”,不這樣寫行不?是運行不了還是性能損失了?或者處于別的什么考慮寫了這個?
    你為什么又要這樣寫“DemoListener extends EventListener”,這個也是必須的嗎?
    我只能說你在不求甚解的時候,已經開始誤人子弟了(有很多人讀了你的這篇博文,而且留言了)。網上有很多類似的帖子,代碼幾乎都是一樣的。不知道是樓樓拷了別人的代碼,還是別人拷了樓樓的代碼,希望樓樓加油,寫出更好的帖子。

    # re: java 事件機制  回復  更多評論   

    2015-04-29 15:17 by 莾s
    多虧看評論了。

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲成a人片7777| 亚洲深深色噜噜狠狠爱网站| 亚洲精品第五页中文字幕| 亚洲国产精品成人网址天堂| 2020久久精品亚洲热综合一本| 国产亚洲欧美在线观看| 性生大片视频免费观看一级| 中文字幕在线免费观看| 久久国产精品亚洲综合| 美女被艹免费视频| 亚洲第一永久AV网站久久精品男人的天堂AV | 国产av天堂亚洲国产av天堂| 亚洲 欧洲 视频 伦小说| 免费无码又爽又刺激聊天APP| 中文字幕专区在线亚洲| 两个人www免费高清视频| 久久精品国产亚洲AV网站| 50岁老女人的毛片免费观看| 在线观看亚洲AV日韩A∨| 国产在线19禁免费观看国产| 国产精品hd免费观看| 国产老女人精品免费视频| 黄色三级三级三级免费看| 在线亚洲午夜理论AV大片| 免费无码国产V片在线观看| 在线播放高清国语自产拍免费 | 四虎永久在线精品视频免费观看| 亚洲的天堂av无码| 四虎成人精品一区二区免费网站| 精品成人一区二区三区免费视频| 久久亚洲AV无码西西人体| 97av免费视频| 鲁啊鲁在线视频免费播放| 国产AV无码专区亚洲AV毛网站| 国产成在线观看免费视频| 色天使色婷婷在线影院亚洲| 亚洲va久久久噜噜噜久久男同| 午夜性色一区二区三区免费不卡视频| 亚洲午夜久久久精品影院| 一区二区免费视频| 亚洲精品成人网站在线播放|