在JAVA程式設計中,事件的處理是非常重要的,尤其是在需要自訂事件和設計JavaBean時.對事件的處理過程有一個完整的認識對於編程是很有協助的。 下面用一個示範性的例子來說明事件及其處理過程 一.事件的組成 如果想要自訂一個事件,則必須提供一個事件的監聽介面以及一個事件類別。在JAVA中監聽介面繼承java.util.EventListener,事件類別繼承java.util.EventObject.很多基本的事件在編程環境中都已經提供可以很方便使用,但是在自訂事件中必須要要瞭解這些。 下面是一個事件類別的代碼,事件類別可以向使用者處理常式提供被監聽類的資訊 import java.util.*; public class PropertyEvent extends EventObject { public PropertyEvent(){} } 下面是監聽介面的代碼 import java.util.*; public interface PropertyListener extends EventListener { public void propertyChanged(PropertyEvent propertyEvent); } 二.事件的處理機制 下面是一段簡要的被監聽類代碼,通過程式碼分析事件處理過程 import java.util.*; public class Exam { private int property; //listeners用來存放登入的監聽對象 private Set listeners= new HashSet(); ..... public void addListener(PropertyListener propertyListener){ //listeners必須保證只能被一個線程訪問 synchronized(listeners){ listeners.add(propertyListener); } } public void firePropertyChange(){ Iterator iterator; synchronized(listeners){ //將listeners中的類名放到iterator iterator = new HashSet(listeners).iterator(); } //建立事件類別 PropertyEvent propertyEvent = new PropertyEvent(); while(iterator.hasNext()){ PropertyListener propertyListener = (propertyListener) iterator.next(); //調用使用者的事件處理常式 propertyListener.propertyChanged(propertyEvent); } } } 當屬性值發生變化時,首先進行內部處理調用firePropertyChange方法,產生一個事件對象然後用事件對象為參數來調用使用者的事件處理常式。 三.事件處理的使用 1.基本用法 public Exam exam; exam.addListener(this); public void propertyChange(PropertyEvent event){...} 註:exam是被監聽對象,this為監聽對象,是已經實現了介面方法的當前類,addListener 將當前類註冊到listeners. 2.一個被監聽對象可以有多個監聽對象 exam.addListener(listener1); exam.addListener(listener2); 這樣當exam的property發生變化時,actionListener1和actionListener2的處理常式都會 被調用。當然listener1和listener2必須都是已實現介面方法的類。 3.被監聽的對象也可以是實現了方法的介面 exam.addListener( new PropertyListener(){ //使用者定義事件處理過程 public void propertyChange(PropertyEvent event){ ... } ); 這種方法在實際編程中非常方便。 |