Java與C#的事件處理都是實現了事件源
Java事件處理
從概念上講
對事件類型和傳遞的模型的定義和擴充提供一個公共框架
與Java語言和環境有較高的集成度
事件能被描述環境捕獲和觸發
能使其它構造工具采取某種技術在設計時直接控制事件
事件機制本身不依賴於復雜的開發工具
事件從事件源到監聽者的傳遞是通過對目標監聽者對象的Java方法調用進行的
事件狀態對象(Event State Object)
與事件發生有關的狀態信息一般都封裝在一個事件狀態對象中
public class MouseMovedExampleEvent extends java
{
protected int x
/* 創建一個鼠標移動事件MouseMovedExampleEvent */
MouseMovedExampleEvent(java
{
super(source);
x = location
y = location
}
/* 獲取鼠標位置*/
public Point getLocation()
{
return new Point(x
}
}
事件監聽者接口(EventListener Interface)與事件監聽者
由於Java事件模型是基於方法調用
/*先定義了一個鼠標移動事件對象*/
public class MouseMovedExampleEvent extends java
{
// 在此類中包含了與鼠標移動事件有關的狀態信息
}
/*定義了鼠標移動事件的監聽者接口*/
interface MouseMovedExampleListener extends java
{
/*在這個接口中定義了鼠標移動事件監聽者所應支持的方法*/
void mouseMoved(MouseMovedExampleEvent mme);
}
在接口中只定義方法名
class ArbitraryObject implements MouseMovedExampleListener
{
public void mouseMoved(MouseMovedExampleEvent mme){
}
ArbitraryObject就是MouseMovedExampleEvent事件的監聽者
事件監聽者的注冊與注銷
為了各種可能的事件監聽者把自己注冊入合適的事件源中
public void add< ListenerType>(< ListenerType> listener)
public void remove< ListenerType>(< ListenerType> listener)
首先定義了一個事件監聽者接口
public interface ModelChangedListener extends java
{
void modelChanged(EventObject e);
}
接著定義事件源類
public abstract class Model
{
private Vector listeners = new Vector(); // 定義了一個儲存事件監聽者的數組
/*上面設計格式中的< ListenerType>在此處即是下面的ModelChangedListener*/
public synchronized void addModelChangedListener(ModelChangedListener mcl)
{
listeners
public synchronized void removeModelChangedListener(ModelChangedListener mcl)
{
listeners
}
/*以上兩個方法的前面均冠以synchronized
protected void notifyModelChanged() {/**事件源使用本方法通知監聽者發生了modelChanged事件*/
Vector l;
EventObject e = new EventObject(this);
/* 首先要把監聽者拷貝到l數組中
synchronized(this)
{
l = (Vector)listeners
}
for (int i =
{
/* 依次通知注冊在監聽者隊列中的每個監聽者發生了modelChanged事件
((ModelChangedListener)l
}
}
}
From:http://tw.wingwit.com/Article/program/net/201311/14840.html