Java事件模型详解(事件捕获3方法)AAA

上传人:我*** 文档编号:130247441 上传时间:2020-04-26 格式:DOC 页数:16 大小:33KB
返回 下载 相关 举报
Java事件模型详解(事件捕获3方法)AAA_第1页
第1页 / 共16页
Java事件模型详解(事件捕获3方法)AAA_第2页
第2页 / 共16页
Java事件模型详解(事件捕获3方法)AAA_第3页
第3页 / 共16页
Java事件模型详解(事件捕获3方法)AAA_第4页
第4页 / 共16页
Java事件模型详解(事件捕获3方法)AAA_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《Java事件模型详解(事件捕获3方法)AAA》由会员分享,可在线阅读,更多相关《Java事件模型详解(事件捕获3方法)AAA(16页珍藏版)》请在金锄头文库上搜索。

1、Java事件模型详解(事件捕获3方法)AAA+ java事件详解 分类: JAVA技术2011-04-29 09:49130人阅读 分析Java的事件处理模型及其原理,介绍了基于事件源识别的捕获3方法/回放所需要了解的关键技术并给出了两种实现方式。1、 Java事件介绍1.1什么是事件 事件本身是表现另一对象状态变化的对象。事件消息是对象间通信的基本方式。 事件在Java中事件是由系统自动生成自动传递到适当的事件处理程序。1.2 Java事件处理的演变 下面对java事件处理的发展做简要的概括。在JDK1.0的版本采用用的事件模型,是一种包容模型,所有事件都封装在单一的 类Event中,由单一

2、的方法handleEvent来处理,这些定义都在Component类中。为此,只有Component类的子类 才能充当事件处理程序,事件处理传递到组件层次结构,如果目标组件不能完全处理事件,事件被传递到目标组件的容器。JDK1.1增加了一些重要的新功能如,RMI、JNI、JDBC、JavaBean。在事件模型上基本框架完全重写,并从Java1.0模型迁移到委托事件模型,在委托模型中事件源生成事件,然后事件处理委托给另一段代码。从JDK1.2开始,引入了Swing包事件处理模型功能更强大,更加可定制GUI组件与他们相关联的支持类。 在后面的版本基本保持了整个事件模型,但加入了一些附加事件类和接口

3、。 在1.3版本开始引入Rebot类,它能模拟鼠标和键盘事件,并用于自动化测试、自 动运行演示、以及其他要求鼠标和键盘控制的应用程序。我们把JDK1.0事件处理模型成为java 1.0事件模型,而从jdk1.1后的版本事件处理模型称为Java 2事件处理模型。在Java1.0事件处理模型中事件处理是以如下方法执行的。deliverEvent()用于决定事件的目标,目标是处理事件的组件或容器,此过程开始 于GUI层的最外部而向内运作。当按一个button时,如果检测到是该按钮激发的事件,该按钮会访问它的deliverEvent()方法,这一操作由 系统完成。一旦识别目标组件,正确事件类型发往组件

4、的postEvent()方法,该方法依次把事件送到handleEvent()方法并且等待方法的返 回值。true表明事件完全处理,false将使postEvent()方法联系目标容器,希望完成事件处理。下面给一个实例:import java.applet.*;import java.awt.*;public class Button1Applet extends Appletpublic void init()add(new Button(Red);add(new Button(Blue);public boolean action(Enent evt,Object whatAction)if

5、( !( evt.target instanceof Button)return false;String buttonlabel=(String)whatAction;if(buttonlabel=Red)setBackground(Color.red);if(buttonlabel= Blue)setBackground(Color.blue);repaint();return true;2、 Java 2事件处理模型 在Java2处理事件时,没有采用dispatchEvent()-postEvent()-handleEvent()方式,采用了监听器类,每个事件类都有相关联的监听器接口。事

6、件从事件源到监听者的传递是通过对目标监听者对象的Java方法调用进行的。对每个明确的事件的发生,都相应地定义一个明确的Java方法。这些方法都集中定义在事件监听者 (EventListener)接口中,这个接口要继承java.util.EventListener。 实现了事件监听者接口中一些或全部方法的类就是事件监听者。伴随着事件的发生,相应的状态通常都封装在事件状态对象中,该对象必须继承自java.util.EventObject。事件状态对象作为单参传递给应响应该事件的监听者方法中。发出某种特定事件的事件源的标识是:遵从规定的设 计格式为事件监听者定义注册方法,并接受对指定事件监听者接口实

7、例的引用。有时,事件监听者不能直接实现事件监听者接口,或者还有其它的额外动作时,就要在一个源与其它一个或多个监听者之间插入一个事件适配器类的实例,来建立它们之间的联系。我们来看下面一个简单的实例:import javax.swing.*;import java.awt.*;import java.awt.event.*;public class SimpleExample extends JFrame JButton jButton1 = new JButton(); public SimpleExample() try jbInit(); catch(Exception e) e.print

8、StackTrace(); private void jbInit() throws Exception jButton1.setText(jButton1); jButton1.addActionListener(new SimpleExample_jButton1_actionAdapter(this); jButton1.addActionListener(new SimpleExample_jButton1_actionAdapter(this); this.getContentPane().add(jButton1, BorderLayout.CENTER); this.setVis

9、ible(true); void jButton1_actionPerformed(ActionEvent e) System.exit(0);public static void main(String args) SimpleExample simpleExample = new SimpleExample(); class SimpleExample_jButton1_actionAdapter implements java.awt.event.ActionListener SimpleExample adaptee; SimpleExample_jButton1_actionAdap

10、ter(SimpleExample adaptee) this.adaptee = adaptee; public void actionPerformed(ActionEvent e) adaptee.jButton1_actionPerformed(e); 3、 事件捕获与回放3.1 Java事件生命周期Java事件和万事一样有其生命周期,会出生也会消亡。下图3.1给出了Java事件生命周期的示意图, 事件最初由事件源产生,事件源可以是GUI组件 Java Bean或由生成事件能力的对象,在GUI组件情况下,事件源或者是组件的同位体(对于Abstract Window Toolkitawt

11、GUI组件来说)或组件本身(对于Swing组件来说)。事件生成后放在系统事件队列内部。现在事件处于事件分发线程的控制下。 事件在队列中等待处理,然后事件从事件队列中选出,送到dispatchEvent()方法,dispatchEvent()方法调用 processEvent()方法并将事件的一个引用传递给processEvent()方法。此刻,系统会查看是否有送出事件的位置,如果没有这种事件 类型相应的已经注册的监听器,或者如果没有任何组件受到激活来接收事件类型,事件就被抛弃。 当然上图显示的是AWTEvent类的子类的生命周期。 dispatchEvent()方法和processEvent(

12、)方法把AWTEvent作为一个参数。 但对,javax.swing.event并不 是AWTEvent子类,而是从EventObject直接继承过来,生成这些事件的对象也会定义fireEvent()方法,此方法将事件送到包含在对 象监听器列表内的那种类型的任何监听器。3.2 Java事件捕获 任何事件产生到dispatchEvent()方法分发方法前,所有的事件都是存放在系统事件的队列中,而且所有的事件都由dispatchEvent()方法来分派。 所以只要能重载dispatchEvent()方法就可以获取系统的所有事件,包括用户输入事件。一般来说, 系统事件队列的操作对用户来说是可以控制。

13、它在后台自动完成所要完成的事情,使用EventQueue类可以查看甚至操纵系统事件队列。 Java提供了EventQueue类来访问甚至操纵系统事件队列。EventQueue类中封装了对系统事件 队列的各种操作,除 dispatchEvent()方法外,其中最关键的是提供了push()方法,允许用特定的EventQueue来代替当前的EventQueue。只 要从EventQueue类中派生一个新类,然后通过push()方法用派生类来代替当前的EventQueue类即可。这样,所有的系统事件都会转发到 派生EventQueue类。然后,再在派生类中重载dispatchEvent()方法就可以截

14、获所有的系统事件,包括用户输入事件。下面一段代码给出一个操纵EventQueue的实例:import java.awt.*;import java.awt.event.*;public class GenerateEventQueue extends Frame implements ActionListenerButton button1 = new Button();TextField textField1 = new TextField();public GenerateEventQueue() try jbInit(); catch(Exception e) e.printStackT

15、race(); public static void main(String args) GenerateEventQueue generateEventQueue = new GenerateEventQueue(); private void jbInit() throws Exception button1.setLabel(button1); button1.addActionListener(this) ; textField1.setText(textField1); this.add(button1, BorderLayout.SOUTH); this.add(textField1, BorderLayout.CENTER); EventQueue eq=getToolkit().getSystemEventQueue() ;/事件捕获1 eq.postEvent(new ActionEvent(button1,ActionEvent.ACTION_PERFORMED,test ) ; addWindowListener(new WinListener();

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 事务文书

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号