【導(dǎo)讀】在JAVA程序設(shè)計(jì)中,事件的處理是非常重要的,尤其是在需要自定義事件和設(shè)計(jì)JavaBean時(shí). 本文用一個(gè)演示性的例子來說明事件及其處理過程。
在JAVA程序設(shè)計(jì)中,事件的處理是非常重要的,尤其是在需要自定義事件和設(shè)計(jì)JavaBean時(shí).對事件的處理過程有一個(gè)完整的認(rèn)識對于編程是很有幫助的。
下面用一個(gè)演示性的例子來說明事件及其處理過程
一.事件的組成
如果想要自定義一個(gè)事件,則必須提供一個(gè)事件的監(jiān)聽接口以及一個(gè)事件類。在JAVA中監(jiān)聽接口繼承java.util.EventListener,事件類繼承java.util.EventObject.很多基本的事件在編程環(huán)境中都已經(jīng)提供可以很方便使用,但是在自定義事件中必須要要了解這些。
下面是一個(gè)事件類的代碼,事件類可以向用戶處理程序提供被監(jiān)聽類的信息
import java.util.*;
public class PropertyEvent extends EventObject {
public PropertyEvent(){}
}
下面是監(jiān)聽接口的代碼
import java.util.*;
public interface PropertyListener extends EventListener {
public void propertyChanged(PropertyEvent propertyEvent);
}
二.事件的處理機(jī)制
下面是一段簡要的被監(jiān)聽類代碼,通過代碼分析事件處理過程
import java.util.*;
public class Exam {
private int property;
//listeners用來存放已注冊的監(jiān)聽對象
private Set listeners= new HashSet();
.....
public void addListener(PropertyListener propertyListener){
//listeners必須保證只能被一個(gè)線程訪問
synchronized(listeners){
listeners.add(propertyListener);
}
}
public void firePropertyChange(){
Iterator iterator;
synchronized(listeners){
//將listeners中的類名放到iterator
iterator = new HashSet(listeners).iterator();
}
//創(chuàng)建事件類
PropertyEvent propertyEvent = new PropertyEvent();
while(iterator.hasNext()){
PropertyListener propertyListener = (propertyListener) iterator.next();
//調(diào)用用戶的事件處理程序
propertyListener.propertyChanged(propertyEvent);
}
}
}當(dāng)屬性值發(fā)生變化時(shí),首先進(jìn)行內(nèi)部處理調(diào)用firePropertyChange方法,產(chǎn)生一個(gè)事件對象然后用事件對象為參數(shù)來調(diào)用用戶的事件處理程序。
三.事件處理的使用
1.基本用法
public Exam exam;
exam.addListener(this);
public void propertyChange(PropertyEvent event){...}
注:exam是被監(jiān)聽對象,this為監(jiān)聽對象,是已經(jīng)實(shí)現(xiàn)了接口方法的當(dāng)前類,addListener 將當(dāng)前類注冊到listeners.
2.一個(gè)被監(jiān)聽對象可以有多個(gè)監(jiān)聽對象
exam.addListener(listener1);
exam.addListener(listener2);
這樣當(dāng)exam的property發(fā)生變化時(shí),actionListener1和actionListener2的處理程序都會被調(diào)用。當(dāng)然listener1和listener2必須都是已實(shí)現(xiàn)接口方法的類。
3.被監(jiān)聽的對象也可以是實(shí)現(xiàn)了方法的接口
exam.addListener(
new PropertyListener(){
//用戶定義事件處理過程
public void propertyChange(PropertyEvent event){
...
}
);
這種方法在實(shí)際編程中非常方便