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

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

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

    hengheng123456789

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks
     

    Event Beginning

     

     

    引自:http://blog.csdn.net/bear110/archive/2006/06/30/854507.aspx

     

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

     

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

     

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

    讓我們一步一步實現(xiàn)它吧:

    1)通過DemoEvent.java文件創(chuàng)建DemoEvent類,這個類繼承EventObject。這個類的構(gòu)造函數(shù)的參數(shù)傳遞了產(chǎn)生這個事件的事件源(比如各種控件),方法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)定義新的事件監(jiān)聽接口,該接口繼承自EventListener;該接口包含對DemeEvent事件的處理程序:

    DemoListener.java

    package demo.listener;

     

    import java.util.EventListener;

     

    public interface DemoListener extends EventListener

    {

           public void demoEvent(DemoEvent dm);

    }

     

     

    通過上面的接口我們再定義事件監(jiān)聽類,這些類具體實現(xiàn)了監(jiān)聽功能和事件處理功能。回想一下上文中那四種實現(xià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.java文件創(chuàng)造一個事件源類,它用一個java.utile.Vector對象來存儲所有的事件監(jiān)聽器對象,存儲方式是通過addListener(..)這樣的方法。notifyDemeEvent(..)是觸發(fā)事件的方法,用來通知系統(tǒng):事件發(fā)生了,你調(diào)用相應(yīng)的處理函數(shù)(回調(diào)函數(shù))吧。

    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)好了,最后寫一個測試程序測試一下我們自定義的事件吧,這段程序應(yīng)該不難理解吧:)

    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.notifyDemoEvent();

     

                  }catch(Exception ex)

                  {ex.printStackTrace();}

           }

     

           public static void main(String args[])

           {

                  new TestDemo();

           }

    }

     

    引自:http://blog.csdn.net/Arhero/archive/2004/11/23/192486.aspx

     

    一、java事件處理機制

     

    java中采取的是面向?qū)ο蟮臋C制。如在java中,要實現(xiàn)自定義事件處理,必須經(jīng)過如下的步驟:

    1 開發(fā)自定義事件類。

    2 定義監(jiān)聽者接口。

    3 定義事件激發(fā)者的接口。

        public void add監(jiān)聽者(監(jiān)聽者);

        public void remove監(jiān)聽者(監(jiān)聽者);

        protected void process事件(事件);

    4 實現(xiàn)事件激發(fā)者.

    5 實現(xiàn)監(jiān)聽這接口。

     

    java中的事件機制是很好理解的。當一個事件激發(fā)事,就調(diào)用process事件方法。這個事件方法會將所有的監(jiān)聽者一一執(zhí)行它監(jiān)聽該事件的接口。(如果消息不消費,允許傳遞的話。)當然這也不是必須的,因為process方法是自己寫的,可以自行決定它執(zhí)行的動作。

     

    實際上,java還有一種簡單的事件處理機制。那就是目前不予推薦的繼承模式。由于簡單性,又不能不說這也可以是編程的一種選擇。但是它在處理事件時,卻只有一種選擇,那就是擴展激發(fā)事件的構(gòu)件并將事件處理代碼嵌入到擴展部分。要做的步驟是:

    1 覆蓋事件處理函數(shù)。

    Applet中的public boolean mouseDown(Event evt, int x, int y).

    如果要激發(fā)和處理自定義事件,如果比較多, 可以仿照awt的做法:

    激發(fā)事件processEvent()--->定位--->process適當Event()--->將事件傳遞到事件處理函數(shù)

     

    二、EventHandler

     

    EventHandler 類為動態(tài)生成事件偵聽器提供支持,這些偵聽器的方法執(zhí)行一條涉及傳入事件對象和目標對象的簡單語句。

     

    EventHandler 類由交互工具(比如應(yīng)用程序生成器)使用,這些工具允許開發(fā)人員在 bean 之間建立連接。通常是建立從用戶界面 bean(事件 source)到應(yīng)用程序邏輯 beantarget)的連接。大多數(shù)這類有效連接隔離了應(yīng)用程序邏輯與用戶界面。例如,用于從 JCheckBox 到接受 boolean 值的方法之間連接的 EventHandler 可以提取復(fù)選框的狀態(tài),并將其直接傳遞給該方法,從而使該方法與用戶界面層隔離。

     

    內(nèi)部類是處理來自用戶界面的事件的另一種更常見方法。EventHandler 類只處理可能使用內(nèi)部類的事件的子集。不過,EventHandler 使用長期持久方案要比使用內(nèi)部類更有效。同樣,在同一接口被實現(xiàn)很多次的大型應(yīng)用程序中,使用 EventHandler 可以減少應(yīng)用程序的磁盤和內(nèi)存占用。

     

    使用 EventHandler 創(chuàng)建偵聽器占用內(nèi)存如此之少的原因是,EventHandler 所依賴的 Proxy 類共享了同一接口的實現(xiàn)。例如,如果使用 EventHandler create 方法生成某個應(yīng)用程序中的所有 ActionListener,則所有動作偵聽器都將是單個類(由 Proxy 類創(chuàng)建)的實例。通常,基于 Proxy 類的偵聽器要求為每個偵聽器類型(接口)創(chuàng)建一個偵聽器類,而使用內(nèi)部類時要求為每個偵聽器(實現(xiàn)接口的對象)創(chuàng)建一個類。

     

    通常不需要直接處理 EventHandler 實例。相反,可使用 EventHandler create 方法之一創(chuàng)建實現(xiàn)給定偵聽器接口的對象。此偵聽器對象在后臺使用一個 EventHandler 對象來封裝關(guān)于事件的信息、發(fā)生事件時接收消息的對象、要發(fā)送的消息(方法)和方法的任意參數(shù)。以下部分給出了如何使用 create 方法創(chuàng)建偵聽器對象的示例。

     

    使用 EventHandler 的示例:

     

    EventHandler 最簡單的使用方法是安裝一個偵聽器,不帶參數(shù)地在目標對象上調(diào)用某個方法。在以下示例中,將創(chuàng)建一個在 javax.swing.JFrame 的實例上調(diào)用 toFront 方法的 ActionListener。

    myButton.addActionListener(

        (ActionListener)EventHandler.create(ActionListener.class, frame, "toFront"));

    當按下 myButton 時,將執(zhí)行 frame.toFront() 語句。通過定義 ActionListener 接口的新實現(xiàn)并將其實例添加到按鈕中,用戶可以獲得同樣的效果,且具有額外的編譯時類型安全:

    //Equivalent code using an inner class instead of EventHandler.

    myButton.addActionListener(new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            frame.toFront();

        }

    });

    EventHandler 的另一種最簡單用法是從偵聽器接口(通常是一個事件對象)中的方法的第一個參數(shù)中提取屬性值,并用其設(shè)置目標對象中的屬性值。在以下示例中,將創(chuàng)建一個 ActionListener,它將目標對象的 nextFocusableComponent 屬性設(shè)置為事件的 "source" 屬性的值。

    EventHandler.create(ActionListener.class, target, "nextFocusableComponent", "source")

    這將對應(yīng)于以下內(nèi)部類實現(xiàn):

    //Equivalent code using an inner class instead of EventHandler.

    new ActionListener() {

        public void actionPerformed(ActionEvent e) {

            button.setNextFocusableComponent((Component)e.getSource());

        }

    }

    EventHandler 最常見的用法可能是從事件對象的 source 中提取屬性值,并將此值設(shè)置為目標對象的屬性值。在以下示例中,將創(chuàng)建一個 ActionListener,它將目標對象的 "label" 屬性設(shè)置為事件源的 "text" 屬性的值("source" 屬性的值)。

    EventHandler.create(ActionListener.class, button, "label", "source.text")

    這將對應(yīng)于以下內(nèi)部類實現(xiàn):

    //Equivalent code using an inner class instead of EventHandler.

    new ActionListener {

        public void actionPerformed(ActionEvent e) {

            button.setLabel(((JTextField)e.getSource()).getText());

        }

    }

    可以使用以 "." 字符分隔的任意數(shù)量的屬性前綴來“限定”事件屬性。采用出現(xiàn)在 "." 字符前面的“限定”名稱作為將應(yīng)用于事件對象的屬性名稱,最左邊的最先應(yīng)用。

    例如,以下動作偵聽器

     

    EventHandler.create(ActionListener.class, target, "a", "b.c.d")

    可以寫成以下內(nèi)部類(假定所有屬性都有規(guī)范的 getter 方法并返回適當?shù)念愋停?/span>

    //Equivalent code using an inner class instead of EventHandler.

    new ActionListener {

        public void actionPerformed(ActionEvent e) {

            target.setA(e.getB().getC().isD());

        }

    }

    posted on 2007-05-30 18:40 哼哼 閱讀(343) 評論(0)  編輯  收藏 所屬分類: JAVA-Common
    主站蜘蛛池模板: 国产亚洲精品久久久久秋霞| 亚洲日本在线免费观看| a视频免费在线观看| 亚洲国产精品综合久久网各| 国产免费久久精品久久久| 国产99精品一区二区三区免费| 无码视频免费一区二三区| 污视频网站在线观看免费| 情人伊人久久综合亚洲| 两个人的视频高清在线观看免费 | 一级人做人爰a全过程免费视频| 成人午夜亚洲精品无码网站| 国产成人精品免费视频动漫| 香蕉视频在线观看免费| 亚洲精品综合久久中文字幕| 亚洲av高清在线观看一区二区 | 在线播放免费播放av片 | 四虎最新永久免费视频| 成年免费大片黄在线观看com| 国产亚洲精AA在线观看SEE| 67194成是人免费无码| 免费人成激情视频在线观看冫| 亚洲va成无码人在线观看| 亚洲女久久久噜噜噜熟女| 日韩成全视频观看免费观看高清| 中文字幕在线免费看| 亚洲高清乱码午夜电影网| 亚洲色大成网站www永久| 精品国产日韩久久亚洲| 亚洲美女又黄又爽在线观看| 国产在线19禁免费观看国产| 国产成人yy免费视频| 久久久高清日本道免费观看| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 日本精品人妻无码免费大全| 免费精品国自产拍在线播放| 亚洲人成日本在线观看| 亚洲AV天天做在线观看| 三上悠亚亚洲一区高清| 亚洲av无码乱码在线观看野外 | 亚洲三级视频在线观看|