您的位置:首页 > 编程语言 > Java开发

Java事件模型学习(2)--实现自己的事件

2009-09-25 20:30 453 查看
当程序的某个模块被调用的时刻不确定,就类似于等待某个事件的发生。这时,可以定义自己的事件进行相应的处理。比如,等待用户的一次输入等。Java的事件模型依赖于委托,通过回调方法进行相应的事件处理。在事件源中,会有fireXXXEvent()就是激活相应的事件,其中会遍历事件源的监听器队列,调用相应监听器的事件处理的回调方法。当某个事件发生时,事件源会调用fireXXXEvent()。实现自己的事件时,需要定义相应的事件类型、事件监听器、事件源。这里可以把事件和事件源定义为接口,方便日后扩展。

这里,我实现的事件是一个定时器事件,当时间过了指定间隔,触发事件。其实,只需要一个Timer就可以实现这个功能,但实在没有找到好的例子。事件源ConcretEventSource有Timer属性,在指定时间间隔到达时,调用fireTimeUp激活所有的事件监听器,从而实现了事件处理。



事件类

package eventmodelstudy;

/**
 * 定时器事件,属性可以保存有用的信息,包括事件源
 * @author Administrator
 */
public 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;
    }
}






事件源接口

package eventmodelstudy;
/**
 * 定时器事件源接口,可以添加、删除定时器事件监听器
 * @author Administrator
 */
public interface TimerEventSource {
    public void addTimerListener(TimerListener tl);
    public void removeTimerListener(TimerListener tl);
}






具体事件源类

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;
/**
 * 定时器事件源具体的实现类。当时间到时激活监听器,调用所有监听器的回调方法回调方法
 * @author Administrator
 */
public 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()));
        }
    }
}






事件监听器接口

package eventmodelstudy;

/**
 * 定时器事件监听接口
 * @author Administrator
 */
public interface TimerListener {
    //当时间到时,进行处理
    public void timeUp(TimerEvent e);
}






具体事件监听器类

package eventmodelstudy;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
/**
 *
 * @author Administrator
 */
public class FrameTimerListener extends JFrame implements TimerListener{
    private JLabel show=new JLabel();
    public FrameTimerListener(){
        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 FrameTimerListener());
        s.addTimerListener(new TimerListener(){

            public void timeUp(TimerEvent e) {
                System.out.println(e.getTime());
            }

        });
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐