实现自己的事件(一)

当程序的某个模块被调用的时刻不确定,就类似于等待某个事件的发生。这时,可以定义自己的事件进行相应的处理。比如,等待用户的一次输入等。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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值