java 事件机制


1/8www.blogjava.net/chenweicai/archive/2007/04/13/110350.html posts - 51, comments - 15, trackbacks - 0, articles - 9 chenweicai BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合 :: 管理 日历 < 2007年4月 > 日 一 二 三 四 五 六 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 1 2 3 4 5 常用链接 我的随笔 我的评论 我的参与 最新评论 留言簿(1) 给我留言 查看公开留言 查看私人留言 随笔分类 Design Pattern English Hibernate J2EE Java(3) Java面试相关(4) Spring Struts WebServices 随笔档案 2007年8月 (1) 2007年6月 (6) 2007年4月 (18) 2007年3月 (18) 2007年2月 (5) 2007年1月 (3) 文章分类 java 事件机制 Posted on 2007-04-13 09:22 chenweicai 阅读(6343) 评论(12) 编辑 收藏 java中的事件机制的参与者有3种角色: 1.event object:就是事件产生时具体的“事件”,用于listener的相应的方法之 中,作为参数,一般存在与listerner的方法之中 2.event source:具体的接受事件的实体,比如说,你点击一个button,那么 button就是event source,这样你必须使button对某些事件进行相应,你就需 要注册特定的listener,比如说MouseEvent之中的MouseClicked方法,这是他 就必须有了add方法 3.event listener:具体的对监听的事件类,当有其对应的event object产生的 时候,它就调用相应的方法,进行处理。在windows程序设计里边这种相应使用 callback机制来实现的 先看看jdk提供的event包: public interface EventListener:所有事件侦听器接口必须扩展的标记接口。 public class EventObject extends Object implements Serializable 所有事件状态对象都将从其派生的根类。 所有 Event 在构造时都引用了对象 "source",在逻辑上认为该对象是最初发生有关 Event 的对象。 在Java2处理事件时,没有采用dispatchEvent()-postEvent()- handleEvent()方式,采用了监听器类,每个事件类都有相关联的监听器接口。事 件从事件源到监听者的传递是通过对目标监听者对象的Java方法调用进行的。   对每个明确的事件的发生,都相应地定义一个明确的Java方法。这些方法都集 中定义在事件监听者(EventListener)接口中,这个接口要继承 java.util.EventListener。 实现了事件监听者接口中一些或全部方法的类就是事 件监听者。   伴随着事件的发生,相应的状态通常都封装在事件状态对象中,该对象必须继 承自java.util.EventObject。事件状态对象作为单参传递给应响应该事件的监听 者方法中。发出某种特定事件的事件源的标识是:遵从规定的设计格式为事件监听 者定义注册方法,并接受对指定事件监听者接口实例的引用。 开始之前首先问个问题:您熟悉java.util.EventObject 和 java.util.EventListener两个类以及他们已有的子类吗? 如果你已经能够熟练使用jdk为我们提供的事件监听器,并且很熟悉MouseEvent, KeyEvent, WindowEvent等等这些jdk为我们准备好的事件,那么想必你对java 的事件机制已经有所理解。但是也许你还是觉得虽然用起来没什么问题,但是原理 还是有些糊涂,那么下面我们再进一步自己实现这些事件和监听器,我们把这个取 名为自定义事件。 其实自定义事件在java中很有用处,我们有的时候想让自己的程序产生一个事件, 但有不希望(或者不可能)用鼠标,键盘之类的输入设备进行操作,比如你写一个 应用程序,在这个程序中一旦收到邮件就对邮件进行相关处理,对于“收到邮件”这 个事件,jdk中就没有定义。对于这样的事件,以及对于这样的事件的监听器,我 2/8www.blogjava.net/chenweicai/archive/2007/04/13/110350.html 文章分类 Design Pattern 文章档案 2007年4月 (1) 2007年3月 (7) 2007年2月 (1) 收藏夹 Java面试相关 搜索 搜索 最新评论 1. re: java clone 感谢博主。。 --fmj 2. re: java 事件机制 受益了,感谢楼主 --啊白 3. re: java 事件机制 嗯,楼上有理,楼主也写的好 --zzw 4. re: java 事件机制 评论内容较长,点击标题查看 --hermit 5. re: java 事件机制 非常谢谢楼主!!!! --路人 阅读排行榜 1. java 事件机制(6343) 2. Jsp 自定义标签(1470) 3. struts标签(1093) 4. ant 编译java程序简介(948 ) 5. java synchronized(939) 评论排行榜 1. java 事件机制(12) 2. java clone(1) 3. 再读struts(1) 4. java模式之动态代理(1) 5. java模式之代理模式(0) 个事件,jdk中就没有定义。对于这样的事件,以及对于这样的事件的监听器,我 们只能自己动手完成了。 那么下面就以实例开始我们这个“创新”的过程:首先,我们要明确jdk中需要的资 源:类EventObject作为父类用来生成我们自己的事件类,接口EventListener用 来实现我们自己的监听器;剩下的事情就是如何注册这些事件以及测试他们了。 (1) 通过DemoEvent.java文件创建DemoEvent类,这个类继承 EventObject。这个类的构造函数的参数传递了产生这个事件的事件源(比如各种 控件),方法getSource用来获得这个事件源的引用。 DemoEvent.java package demo.listener; import java.util.EventObject; public class DemoEvent extends EventObject { Object obj; public DemoEvent(Object source) { super(source); obj = source; } public Object getSource() { return obj; } public void say() { System.out.println("This is say method..."); } } (2) 定义新的事件监听接口,该接口继承自EventListener;该接口包 含对DemeEvent事件的处理程序: DemoListener.java package demo.listener; import java.util.EventListener; 3/8www.blogjava.net/chenweicai/archive/2007/04/13/110350.html public interface DemoListener extends EventListener { public void demoEvent(DemoEvent dm); } 通过上面的接口我们再定义事件监听类,这些类具体实现了监听功能 和事件处理功能。回想一下上文中那四种实现方式,我们这里不正是 使用了其中的第三种——外部类写法的方式吗? Listener1.java package demo.listener; public class Listener1 implements DemoListener { public void demoEvent(DemoEvent de) { System.out.println("Inside listener1..."); } } Listener2.java package demo.listener; public class Listener2 implements DemoListener { public void demoEvent(DemoEvent de) { System.out.println("Inside listener2..."); } } Listener3.java package demo.listener; 4/8www.blogjava.net/chenweicai/archive/2007/04/13/110350.html public class Listener3 implements DemoListener { public void demoEvent(DemoEvent de) { System.out.println("Inside listener3..."); } } (3) 通过DemeSource..ava文件创造一个事件源类,它用一个 java.utile.Vector对象来存储所有的事件监听器对象,存储方式是通 过addListener(..)这样的方法。notifyDemeEvent(..)是触发事件 的方法,用来通知系统:事件发生了,你调用相应的处理函数(回调 函数)吧。 DemoSource.java package demo.listener; import java.util.*; public class DemoSource { private Vector repository = new Vector(); DemoListener dl; public DemoSource() { } public void addDemoListener(DemoListener dl) { repository.addElement(dl); } public void notifyDemoEvent() { Enumeration enum = repository.elements(); while(enum.hasMoreElements()) 5/8www.blogjava.net/chenweicai/archive/2007/04/13/110350.html { dl = (DemoListener)enum.nextElement(); dl.demoEvent(new DemoEvent(this)); } } } (4) 好了,最后写一个测试程序测试一下我们自定义的事件吧,这段程 序应该不难理解吧:) TestDemo.java package demo.listener; public class TestDemo { DemoSource ds; public TestDemo() { try{ ds = new DemoSource(); Listener1 l1 = new Listener1(); Listener2 l2 = new Listener2(); Listener3 l3 = new Listener3(); ds.addDemoListener(l1); ds.addDemoListener(l2); ds.addDemoListener(l3); ds.addDemoListener(new DemoListener(){ public void demoEvent(DemoEvent event){ System.out.println("Method come from 匿名类..."); } }); ds.notifyDemoEvent(); 6/8www.blogjava.net/chenweicai/archive/2007/04/13/110350.html }catch(Exception ex) {ex.printStackTrace();} } public static void main(String args[]) { new TestDemo(); } } 评论 # re: java 事件机制 回复 更多评论 2007-09-29 15:33 by somesongs 解惑啊,写得非常好,谢谢。 本来自己还想边学边写,但无法超越了。呵呵。 # re: java 事件机制 回复 更多评论 2007-12-18 13:40 by hondz 还是有收获的,但是例子倒是没啥看明白,初学可能是水平太次了吧, DemoEvent对象在哪里创建的呢?如果在事件处理器中调用say方法会不会抛空 指针异常? # re: java 事件机制 回复 更多评论 2007-12-18 14:03 by hondz 不好意思了,在notify方法里面创建的,完全明白了,谢谢!! # re: java 事件机制 回复 更多评论 2008-01-21 11:33 by 卢剑鸣 浅显易懂!赞! # re: java 事件机制 回复 更多评论 2008-11-24 19:51 by 路段的 凤飞飞 7/8www.blogjava.net/chenweicai/archive/2007/04/13/110350.html # re: java 事件机制 回复 更多评论 2008-12-12 17:20 by 鲍鲍 不错。谢谢楼主。 # re: java 事件机制[未登录] 回复 更多评论 2009-03-30 10:33 by abc Observer pattern # re: java 事件机制[未登录] 回复 更多评论 2009-05-11 17:53 by neo 恩 很好 赞一个 # re: java 事件机制 回复 更多评论 2009-05-13 17:51 by 路人 非常谢谢楼主!!!! # re: java 事件机制 回复 更多评论 2009-08-11 20:10 by hermit 这个例子还是有些问题的。主要是事件何时触发应该是由 DemoSource 自身决定 的,所以,事件源 DemoSource 的通知方法 notifyDemoEvent 一般是私有的 方法,或者若你想 DemoSource 可以有子类,那么设成protected。也就是 notifyDemoEvent 应该由 DemoSource 在能够发生DemoEvent 时自己来调 用,而何时发生DemoEvent事件,是DemoSource 自身特点决定的,外部对象是 不知道的。比如我们可以在 DemoEvent 中加一个属性 demoValue, private int demoValue; public int getDemoValue() { return demoValue; } public void setDemoValue(int val) { this.demoValue = val; notifyDemoEvent(new DemoEvent(this)); } 这时,外部对象 TestDemo 可以调用 ds.setDemoValue(1),就使 DemoSource 触发了事件,并通知各个监听器处理事件。外部对象 TestDemo 不应该调用 notifyDemoEvent 方法,它怎么知道什么时候应该发生 DemoEvent 事件呢? # re: java 事件机制 回复 更多评论 2009-09-04 10:24 by zzw 嗯,楼上有理,楼主也写的好 # re: java 事件机制 回复 更多评论 2009-10-10 12:08 by 啊白 受益了,感谢楼主 8/8www.blogjava.net/chenweicai/archive/2007/04/13/110350.html 新用户注册 刷新评论列表 程序员找工作,就在博客园招聘频道 博客园 博问 IT新闻 Java程序员招聘 标题 re: java 事件机制 姓名 主页 验证码 * 内容(请不要发表任何与政治相关的内容) Remember Me? 提交 登录 [使用Ctrl+Enter键可以直接提交] 网站导航: 博客园 IT新闻 知识库 C++博客 程序员招聘 管理 Powered by: BlogJava Copyright © chenweicai
还剩7页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 3 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

huanglong

贡献于2014-07-29

下载需要 3 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf