public class MouseMovedExampleEvent extends java。util。EventObject { PRotected int x, y; /* 創(chuàng)建一個鼠標(biāo)移動事件MouseMovedExampleEvent */ MouseMovedExampleEvent(java.awt.Component source, Point location) { super(source); x = location.x; y = location.y; } /* 獲取鼠標(biāo)位置*/ public Point getLocation() { return new Point(x, y); }} 事件監(jiān)聽者接口(EventListener Interface)與事件監(jiān)聽者
public void add〈 ListenerType〉(〈 ListenerType〉 listener); public void remove〈 ListenerType〉(〈 ListenerType〉 listener);
首先定義了一個事件監(jiān)聽者接口:
public interface ModelChangedListener extends java。util。EventListener { void modelChanged(EventObject e); }
接著定義事件源類:
public abstract class Model { private Vector listeners = new Vector(); // 定義了一個儲存事件監(jiān)聽者的數(shù)組 /*上面設(shè)計格式中的〈 ListenerType〉在此處即是下面的ModelChangedListener*/
public synchronized void addModelChangedListener(ModelChangedListener mcl) { listeners.addElement(mcl); }//把監(jiān)聽者注冊入listeners數(shù)組中 public synchronized void removeModelChangedListener(ModelChangedListener mcl) { listeners.removeElement(mcl); file://把監(jiān)聽者從listeners中注銷 } /*以上兩個方法的前面均冠以synchronized,是因為運行在多線程環(huán)境時,可能同時有幾個對象同時要進(jìn)行注冊和注銷操作,使用synchronized來確保它們之間的同步。開發(fā)工具或程序員使用這兩個方法建立源與監(jiān)聽者之間的事件流*/
protected void notifyModelChanged() {/**事件源使用本方法通知監(jiān)聽者發(fā)生了modelChanged事件*/ Vector l; EventObject e = new EventObject(this); /* 首先要把監(jiān)聽者拷貝到l數(shù)組中,凍結(jié)EventListeners的狀態(tài)以傳遞事件。這樣來確保在事件傳遞到所有監(jiān)聽者之前,已接收了事件的目標(biāo)監(jiān)聽者的對應(yīng)方法暫不生效。*/ synchronized(this) { l = (Vector)listeners.clone(); } for (int i = 0; i 〈 l.size(); i++) { /* 依次通知注冊在監(jiān)聽者隊列中的每個監(jiān)聽者發(fā)生了modelChanged事件, 并把事件狀態(tài)對象e作為參數(shù)傳遞給監(jiān)聽者隊列中的每個監(jiān)聽者*/ ((ModelChangedListener)l.elementAt(i)).modelChanged(e); } } }
由于是通過delegate來處理事件,因此,可能通過累加使一個事件具有多個響應(yīng)方法;與此同時,還可以使一個方法作為多個事件的響應(yīng)方法(注重:在C#語言類中的event成員后面只能出現(xiàn)"+="與"-="兩個表示添加與取消事件響應(yīng)函數(shù)的操作符)。不管是ASP。Net還是一般的Windows Forms 編程,在C#中,基本上我們碰到的事件響應(yīng)方法都是說明成如下的形式: