当程序的某个模块被调用的时刻不确定,就类似于等待某个事件的发生。这时,可以定义自己的事件进行相应的处理。比如,等待用户的一次输入等。Java的事件模型依赖于委托,通过回调方法进行相应的事件处理。在事件源中,会有fireXXXEvent()就是激活相应的事件,其中会遍历事件源的监听器队列,调用相应监听器的事件处理的回调方法。当某个事件发生时,事件源会调用fireXXXEvent()。实现自己的事件时,需要定义相应的事件类型、事件监听器、事件源。这里可以把事件和事件源定义为接口,方便日后扩展。
这里,我实现的事件是一个定时器事件,当时间过了指定间隔,触发事件。其实,只需要一个Timer就可以实现这个功能,但实在没有找到好的例子。事件源ConcretEventSource有Timer属性,在指定时间间隔到达时,调用fireTimeUp激活所有的事件监听器,从而实现了事件处理。
事件类
view plaincopy to clipboardprint?
package eventmodelstudy;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.Timer;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
* 定时器事件,属性可以保存有用的信息,包括事件源
* @author Administrator
*/
class TimerEvent{
private TimerEventSource source;//事件源
private String time;//当前时间
public TimerEvent(TimerEventSource source,String time){
this.source=source;
this.time=time;
}
public Object getSource(){
return this.source;
}
public String getTime(){
return this.time;
}
}
/**
* 定时器事件源接口,可以添加、删除定时器事件监听器
* @author Administrator
*/
interface TimerEventSource {
public void addTimerListener(TimerListener tl);
public void removeTimerListener(TimerListener tl);
}
/**
* 定时器事件源具体的实现类。当时间到时激活监听器,调用所有监听器的回调方法回调方法
* @author Administrator
*/
class ConcretEventSource implements TimerEventSource{
private Timer timer;
//监听器队列,保存所有注册的监听器
private Vector<TimerListener> eventQueue=new Vector();
public ConcretEventSource(int timeGap){
timer=new Timer(timeGap,new ActionListener(){
public void actionPerformed(ActionEvent e) {
//当时间到时,激活监听器
fireTimeUp();
}
});
timer.start();
}
public void addTimerListener(TimerListener tl) {
eventQueue.add(tl);
}
public void removeTimerListener(TimerListener tl) {
eventQueue.remove(tl);
}
private void fireTimeUp(){
Iterator<TimerListener> iter=eventQueue.iterator();
TimerListener tl;
while(iter.hasNext()){
tl=iter.next();
//回调监听器的方法,进行时间处理
tl.timeUp(new TimerEvent(this,new Date().toString()));
}
}
}
/**
* 定时器事件监听接口
* @author Administrator
*/
interface TimerListener {
//当时间到时,进行处理
public void timeUp(TimerEvent e);
}
/**
*
* @author Administrator
*/
public class Test extends JFrame implements TimerListener{
private JLabel show=new JLabel();
public Test(){
add(show,BorderLayout.CENTER);
setTitle("EventModel");
setSize(200,100);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void timeUp(TimerEvent e) {
show.setText(e.getTime());
}
public static void main(String[] args) {
// TODO code application logic here
ConcretEventSource s=new ConcretEventSource(1000);
s.addTimerListener(new Test());
s.addTimerListener(new TimerListener(){
public void timeUp(TimerEvent e) {
System.out.println(e.getTime());
}
});
}
}
本文来自CSDN博客:http://blog.csdn.net/chosen0ne/archive/2009/09/26/4595373.aspx