Java事件模型学习(2)--实现自己的事件
2009-09-25 20:30
453 查看
当程序的某个模块被调用的时刻不确定,就类似于等待某个事件的发生。这时,可以定义自己的事件进行相应的处理。比如,等待用户的一次输入等。Java的事件模型依赖于委托,通过回调方法进行相应的事件处理。在事件源中,会有fireXXXEvent()就是激活相应的事件,其中会遍历事件源的监听器队列,调用相应监听器的事件处理的回调方法。当某个事件发生时,事件源会调用fireXXXEvent()。实现自己的事件时,需要定义相应的事件类型、事件监听器、事件源。这里可以把事件和事件源定义为接口,方便日后扩展。
这里,我实现的事件是一个定时器事件,当时间过了指定间隔,触发事件。其实,只需要一个Timer就可以实现这个功能,但实在没有找到好的例子。事件源ConcretEventSource有Timer属性,在指定时间间隔到达时,调用fireTimeUp激活所有的事件监听器,从而实现了事件处理。
事件类
事件源接口
具体事件源类
事件监听器接口
具体事件监听器类
这里,我实现的事件是一个定时器事件,当时间过了指定间隔,触发事件。其实,只需要一个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()); } }); } }
相关文章推荐
- Java学习之 Java事件模型
- java jvm学习笔记六(实现写自己的安全管理器)
- java基础学习总结——关于Java中事件分发和监听机制实现的代码实例
- java多线程学习之通过ThreadLocal实现每个线程拥有自己的变量
- java事务学习笔记(四)--成功的案例(自己实现一个线程安全的TransactionManager)
- 仿net事件委托的java事件模型实现
- 【面向对象课程项目:纸牌】Java实例学习(二):优秀源码与自己模型的对比
- java-面向对象之继承(感言:经过第一天和Java中类的继承和接口的实现的接触,自己需要学习的还很多,还要从基础抓起,尽管有点迷糊,但学到很多很喜欢这种时光!加油!)下面是查到的相关资料以备查看。
- Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解
- Java 多线程学习之生产者消费者模型:一个较完善的实现
- 非专业码农 JAVA学习笔记 用户图形界面设计与实现-所有控件的监听事件
- Java多线程学习之 BlockingQueue实现生产者和消费者模型
- 分布式学习笔记1通过Java自己实现简单的HTTP RPC框架
- Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解
- JAVA 使用Interface 实现自己的事件监听
- Netty学习之旅------线程模型前置篇Reactor反应堆设计模式实现(基于java.nio)
- 关于面试中的原生js实现事件代理和事件模型和事件广播的学习
- JAVA(学习笔记1.2)——事件处理模型
- java实现简单的页面布局和按钮单击事件(学习中)
- 仿net事件委托的java事件模型实现