【Java精品源码栏目提醒】:网学会员在Java精品源码频道为大家收集整理了“java事件处理机制自定义事件 - 其它资料“提供大家参考,希望对大家有所帮助!
java 事件处理机制 自定义事件ava 中的事件机制的参与者有3种角色: 1.event object:事件状态对象,用于 listener 的相应的方法之中,作为参数,一般存在与 listerner 的方法之中 2.event source:具体的事件源,比如说,你点击一个 button,那么 button 就是 event source,要想使 button 对某些事件进行响应,你就需要注册特定的 listener。
3.event listener:具体的对监听的事件类,当它监听到 eventobject 产生的时候,它就调用相应的方法,进行处理。
先看看 jdk 提供的 event 包: public interface EventListener:所有事件侦听器接口必须扩展的标记接口。
public class EventObject extends Object implementsSerializable 所有事件状态对象都将从其派生的根类。
所有 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 中就没有定义。
对于这样的事件,以及对于这样的事件的监听器,我们只能自己动手完成了。
那么下面就以实例开始我们这个“创新”的过程: 类 首先, EventObject作为父类用来生成我们自己的事件类,接口 EventListener 用来实现我们自己的监听器剩下的事情就是如何注册这些事件以及测试他们了。
1通过 DoorEvent.
java 文件创建 DoorEvent 类,这个类继承EventObject。
/ 定义事件对象,必须继承 EventObject / package test import
java.util.EventObject public class DoorEvent extends EventObject private String doorState //表示门的状态,有“开”和“关”两种 public DoorEventObject source String doorState supersource this.doorState doorState public void setDoorStateString doorState this.doorState doorState public String getDoorState return this.doorState 2定义新的事件监听接口,该接口继承自 EventListener该接口包含对 doorEvent 事件的处理程序: / 定义监听接口,负责监听 DoorEvent 事件 / package test import
java.util.EventListener public interface DoorListener extends EventListener public void doorEventDoorEvent event 通过上面的接口我们再定义事件监听类,这些类具体实现了监听功能和事件处理功能。
/ 该类为 门1监听接口的实现,做具体的开门,关门动作 / package test public class DoorListener1 implements DoorListener public void doorEventDoorEvent event ifevent.getDoorStatenullevent.getDoorState.equalsopen System.out.println门1打开 else System.out.println门1关闭 / 该类为 门2监听接口的实现,做具体的开门,关门,以及开灯,关灯动作/ package test public class DoorListener2 implements DoorListener public void doorEventDoorEvent event ifevent.getDoorStatenullevent.getDoorState.equalsopen System.out.println门2打开,同时打开走廊的灯 else System.out.println门2关闭,同时关闭走廊的灯 3 通 过 DoorManager.
java 创 造 一 个 事 件 源 类 , 它 用 一 个Collection listeners 对象来存储所有的事件监听器对象,存储方式是通过 addDoorListener..这样的方法。
notifyListeners..是触发事件的方法,用来通知系统:事件发生了,你调用相应的处理函数吧。
/ 事件源对象,在这里你可以把它想象成一个控制开门关门的遥控器, 如果是在 swing 中,就类似一个 button / package test import
java.util. public class DoorManager private Collection listeners / 添加事件 param listener DoorListener/public void addDoorListenerDoorListener listener if listeners null listeners new HashSetlisteners.addlistener/ 移除事件 param listener DoorListener/public void removeDoorListenerDoorListener listener if listeners nullreturnlisteners.removelistener/ 触发开门事件/protected void fireWorkspaceOpened if listeners nullreturn DoorEvent event new DoorEventthis open notifyListenersevent / 触发关门事件 / protected void fireWorkspaceClosed if listeners nullreturn DoorEvent event new DoorEventthis close notifyListenersevent / 通知所有的 DoorListener / private void notifyListenersDoorEvent event Iterator iter listeners.iterator while iter.hasNext DoorListener listener DoorListener iter.next listener.doorEventevent 4好了,最后写一个测试程序测试一下我们自定义的事件吧,这段程序应该不难理解吧: / 主程序,就想象成要开门的哪个人 / package test public class DoorMain public static void mainString args DoorManager manager new DoorManager manager.addDoorListenernew DoorListener1//给门1增加监听器 manager.addDoorListenernew DoorListener2//给门2增加监听器 //开门 manager.fireWorkspaceOpened System.out.println我已经进来了 //关门 manager.fireWorkspaceClosed 运行 DoorMain 门1打开 门2打开,同时打开走廊的灯 我已经进来了 门1关闭 门2关闭,同时关闭走廊的灯 下面我们看一个 jdk 内部是如何处理事件机制的,你可以和上面的自定义事件做一个比较,你会高兴的发现机制是一样的。
/
java swing 的监听器,实现 ActionListener 接口,注意参数:事件状态类:ActionEvent / package test import
java.awt. import
java.awt.event. import javax.swing. class SimpleListener implements ActionListener / 利用该类来监听事件源产生的事件,利用响应机制 / public void actionPerformedActionEvent e String buttonName e.getActionCommandif buttonName.equals按钮1 System.out.println按钮1 被点击 public class ActionTest private static JFrame frame // 定义为静态变量以便 main 使用 private static JPanel myPanel // 该面板用来放置按钮组件 private JButton button1 // 这里定义按钮组件 public ActionTest // 构造器 建立图形界面 // 新建面板 myPanel new JPanel // 新建按钮 button1 new JButton按钮1 // 新建按钮1 // 建立一个 actionlistener 让按钮1注册,以便响应事件 SimpleListener ourListener new SimpleListener button1.addActionListenerourListener myPanel.addbutton1 // 添加按钮到面板 public static void mainString s ActionTest gui new ActionTest // 新建 Simple1组件 frame new JFrameSimple1 // 新建 JFrame // 处理关闭事件的通常方法 frame.addWindowListenernew WindowAdapter public void windowClosingWindowEvent e System.exit0 frame.getContentPane.addmyPanel frame.pack frame.setVisibletrue 在这里,我们再看一下
java 中的事件机制的参与者的3种角色: 我们定义了一个 SimpleListener 实现 ActionListener 接口, 1.event object:事件状态对象,用于 listener 的相应的方法之中。
用了 jdk 提供的 ActionEvent,不需要我们自己定义。
,注册特定的 2.event source:具体的事件源,就是哪个 button,SimpleListener。
3.event listener:具体的对监听的事件类,当它监听到 event object 产生的时候,它就调用相应的方法,进行处理。
这里是我们自己定义的 SimpleListener。
是不是和上面自定义的事件在机制上完全一致呢Yes---------------------------------------------------------------------------------------------------------------------------这里你也许会问,为什么 event object 不需要我们自己定义呢你可以想一下,这是一个表示“事件状态变化”的类,你能扑获“鼠标变化” 吗这好象和平台有关的低层编码了,所有所不可能扑获,也没有必要去扑获,这些 jdk 已经给我们实现了。
简单的看一下 ActionEvent这个类 ,它继承了
java.awt.AWTEvent, 在这个类的构造方法
源码如下: static / ensure that the necessary native libraries are loaded / Toolkit.loadLibraries if GraphicsEnvironment.isHeadless initIDs 我们在看 jdk 官方的解释: Toolkit 是 Abstract Window Toolkit 的所有实际实现的抽象超类。
Toolkit 的子类被用于将各种组件绑定到特定本机工具包实现。
大多数应 用程序不应直接调用该类中的任何方法。
Toolkit 定义的方法是“胶合剂”,将
java.awt 包中与平台无关的类与
java.awt.peer 中的对应物 连接起来。
Toolkit 定义的一些方法能直接查询本机操作系统。