2013-12-29 06:30:02

阅读( 68 )

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中就没有定义。对于这样的事件,以及对于这样的事件

的监听器,我们只能自己动手完成了。

那么下面就以实例开始我们这个“创新”的过程:首先,我们要明确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; 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; 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()) { 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(); }catch(Exception ex) {ex.printStackTrace();} } public static void main(String args[]) { new TestDemo(); } }

分享给朋友:

亲~ 如果您有更好的答案 可在评论区发表您独到的见解。

您想查看更多的信息:

面试题

java事件处理的题目_介绍一下java的事件机制相关推荐

  1. java 金融面试题目_面试题 - java金融 - 博客园

    1,什么是线程安全 (参考书:https://book.douban.com/subject/10484692/) 不对共享变量进行修改 2,都说String是不可变的,为什么我可以这样做呢 Stri ...

  2. java毕业设计选题方向_一份java方向毕业设计题目分享学习_东哥毕设

    一份java方向毕业设计题目分享学习 一.该毕业设计的设计方案 1.前台:用户登录及注册.商品搜索.商品信息查看.修改个人信息.商品推荐.订单查看.商品购买.商品评价.商品租赁 2.后台:商品信息管理 ...

  3. 百度高级Java三面题目!涵盖JVM +Java锁+分布式等

    百度高级Java一面 自我介绍 对象相等的判断,equals方法实现. Hashcode的作用,与 equal 有什么区别? Java中CAS算法? G1回收器讲一下? HashMap,Concurr ...

  4. java反编译工具_如何保护Java程序 才能防止Java反编译

    简介:Java是一种跨平台的.解释型语言.Java 源代码编译中间"字节码"存储于class文件中.Class文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如 ...

  5. 基于java的扫雷论文_毕业论文基于JAVA的扫雷游戏设计

    毕业论文基于JAVA的扫雷游戏设计 课 程 设 计 报 告 课程名称: 计算机技术综合课程设计 题 目: 基于JAVA语言的扫雷游戏设计 学 院: 信息工程 系: 计算机 专 业: 计算机科学与技术 ...

  6. java 变量与常量_详解Java变量与常量

    一.常量 用final修饰(也称最终变量) 常量在声明时必须赋初值,赋值后不能再修改值 常量名通常用全大写字母表示 声明时需要添加final或static final类型修饰符,例如: private ...

  7. 深入理解Java虚拟机知乎_深入理解Java虚拟机(类文件结构)

    深入理解Java虚拟机(类文件结构) 欢迎关注微信公众号:BaronTalk,获取更多精彩好文! 之前在阅读 ASM 文档时,对于已编译类的结构.方法描述符.访问标志.ACC_PUBLIC.ACC_P ...

  8. java同步异步调用_详解java 三种调用机制(同步、回调、异步)

    1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...

  9. java的弱引用_深入理解Java中的弱引用

    不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?& ...

  10. java不同垃圾回收器_细述 Java垃圾回收机制→Types of Java Garbage Collectors

    本文非原创,翻译自Types of Java Garbage Collectors 在Java中为对象分配和释放内存空间都是由垃圾回收线程自动执行完成的.和C语言不一样的是Java程序员不需要手动写垃 ...

最新文章

  1. web自适应尺寸方法
  2. 【全新打造】思科认证跟踪系统考试注册教程(08.8.30)附word文件下载
  3. 进阶学习(3.6) Prototype Pattern 原型模式
  4. python求零点_python – 计算大序列的过零点的结果不同
  5. 绘制扇形的多种方式,包括border-radius、clip裁剪显示、canvas原点变换等方式的详细理解及demo
  6. VS2008超有用的快捷键
  7. 函数编程中的递归思想
  8. how to set up github blog
  9. Jensen不等式证明
  10. 刚安装mysql怎么设置密码_安装完MySQL数据库设置密码
  11. 一文掌握GSEA,超详细教程!
  12. 【上海交大oj】畅畅的牙签袋(状态压缩dp)
  13. 使用python和tornado实现多人网页聊天程序--界面
  14. 安装iperf,提示:没有可用软件包 iperf
  15. 土豆网前任CTO开无人便利店,半年达500家
  16. 关于setObjectName的思考
  17. rectangle函数的使用
  18. Leetcode算法Java全解答--12. 整数转罗马数字
  19. 鼠标单击、右击、双击、鼠标悬停、鼠标拖动
  20. Spring EL表达式

热门文章

  1. 机器学习笔记【二】逻辑回归与分类(2):感知机学习算法与逻辑回归的区别,牛顿方法
  2. keras读取训练好的模型参数并把参数赋值给其它模型
  3. NLP学习------HanLP使用实验
  4. day042 css 选择器
  5. URAL - 1153 Supercomputer 大数开方
  6. 面向对象的三大特性和五大原则
  7. ssh 端口转发实现外网 80 端口映射到内网 80 端口
  8. MyEclipse中VSS的使用详解
  9. 微信公众平台开发(51)会员卡
  10. 在MFC中通过opencv显示摄像头视频或者文件视频