`

java事件模型

阅读更多

事件源类:描述事件发生源的基本属性和行为。比如,按钮是很多事件发生的事件源,Java构造按钮类来描述按钮的形状,颜色等等属性以及在屏幕上绘制按钮等动作,当然也包括按钮按下等相关事件发生本身。同时,在事件发生时,事件源类还负责发出事件发生的通知。该行为通过事件源查找自己的事件监听者队列,并将事件信息通知队列中的监听者来完成。同时,事件源还在得到有关监听者信息时负责维护自己的监听者队列。
事件类:定义事件的特征;

事件监听器接口:事件发生后,事件源要将相关的信息通知对应的监听者。这要求必须在事件源和监听者之间定义一个标准的接口规范,以便完成这样的信息交换。监听者接口正是负责定义这样的接口规范。也就是定义监听器应该实现的功能;

事件监听器适配器类:Java中,由于应用接口必须在应用的类中实现接口中的所有申明函数,有时对于不需要使用所有申明函数的监听者比较麻烦,所以通常可以编写一个基础的适配器类来应用接口,适配器中预先实现所有的空接口函数,监听者则通过继承适配器并重载自己需要的接口函数来避免直接应用接口的麻烦。

事件监听器类:实现监听器接口,监听事件的发生并作出响应;

所有的事件类必须继承Java事件基类,即java.util.EventObject;EventObject(Object source)是EventObject唯一的构造方法,这意味着所有事件必须在实例化时就指定事件源;EventObject类提供了getSource()方法来获取事件源;
定义了事件类后,产生一个事件,就是生成事件类的一个实例。
除了事件源,复杂的事件类代码可以含有其他属性、方法,包含更多的信息,如事件的名称、事件发生的时间、事件所属类别以及事件的描述等等

监听器接口定义了一个类要成为监听器必须具备的功能。所有的监听器接口也都必须继承监听器接口基类java.util.EventListener;EventListener本身没有定义任何方法,它只是一个标志接口,用来表明所有继承自EventListener的接口属于监听器接口。
监听器接口定义了监听器必须实现的方法。可以在监听器接口中定义任意多的事件处理方法,取决于应用所需,事件处理方法以事件对象作为入口参数,包含对事件进行处理的代码,方法名称任意,如processEvent或者handleEvent之类。

监听器是监听器接口的实现者,提供监听器接口中定义的所有方法的实现代码。简单情形下,一个监听器只监听一种类型的事件,即实现一种监听器接口。复杂的监听器可以实现多种监听器接口,监听多种类型的事件。在事件处理方法代码中,监听器可以从入口参数中获得事件对象,并通过该对象获得所需的信息,例如事件源、事件发生时间等等。事件源是一定可以从事件对象中 获得的,因为事件基类EventObject提供了getSource()方法,除此以外,能从事件对象中获得的信息,取决于事件类的定义。

 

 

介绍了那么多,下面给出一个完整的实例,这个例子是将网上的一个实例修改完善后的。修改后的实例完全符合我上面介绍的情形。这个实例会让你更容易理解java的事件模型。

 

事件类:

 

package com.amuse.event;

import java.util.EventObject;

/**
 * 类DoorEvent.java的实现描述:DoorEvent.java
 * <p>
 * 这是一个事件类继承了 java.util.EventObject
 * 
 * @author yongchun.chengyc 2012-3-13 下午5:17:57
 */
public class DoorEvent extends EventObject {

    private String doorState = "";

    /**
     * @param source
     */
    public DoorEvent(Object source, String doorState){
        super(source);
        this.doorState = doorState;
    }

    /**
     * @return the doorState
     */
    public String getDoorState() {
        return doorState;
    }

    /**
     * @param doorState the doorState to set
     */
    public void setDoorState(String doorState) {
        this.doorState = doorState;
    }

}

 

 

事件监听器接口:

 

package com.amuse.event;

import java.util.EventListener;

/**
 * 类DoorEventListener.java的实现描述:DoorEventListener.java
 * <P>
 * 这是一个事件监听接口,继承了java.util.EventListener类
 * 
 * @author yongchun.chengyc 2012-3-13 下午5:22:28
 */
public interface DoorEventListener extends EventListener {

    public long beforeHandleDoorEvent();

    public void handleDoorEvent(DoorEvent event);

    public long afterHandlerDoorEvent();

}

 

 事件监听器适配器:

 

package com.amuse.event;

/**
 * 类DoorEventAdapter.java的实现描述:DoorEventAdapter.java
 * <p>
 * 这是一个监听器适配器,用于实现监听器接口的一些方法,方便具体的监听器实现类的编写。
 * 
 * @author yongchun.chengyc 2012-3-13 下午9:33:13
 */
public abstract class DoorEventAdapter implements DoorEventListener {

    public long beforeHandleDoorEvent() {
        return System.currentTimeMillis();
    }

    public long afterHandlerDoorEvent() {
        return System.currentTimeMillis();
    }

}

 

 事件监听器实现类1:

 

package com.amuse.event;

/**
 * 类DoorEventListener1.java的实现描述:DoorEventListener1.java
 * <p>
 * 具体的监听器实现类
 * 
 * @author yongchun.chengyc 2012-3-13 下午5:24:34
 */
public class DoorEventListener1 extends DoorEventAdapter {

    /*
     * (non-Javadoc)
     * @see com.amuse.event.DoorEventListener#onDoorEvent(com.amuse.event.DoorEvent)
     */
    @Override
    public void handleDoorEvent(DoorEvent event) {

        if ((event != null) && (event.getDoorState().equals("open"))) {
            System.out.println("the door are opened!-------->in listener1---->事件源" + event.getSource()“);
        } else {
            System.out.println("the door are closed!-------->in listener1---->事件源" + event.getSource()”);
        }

    }

}

 

 事件监听器实现类2:

 

package com.amuse.event;

/**
 * 类DoorEventListener1.java的实现描述:DoorEventListener1.java
 * <p>
 * 具体的监听器实现类
 * 
 * @author yongchun.chengyc 2012-3-13 下午5:24:34
 */
public class DoorEventListener2 extends DoorEventAdapter {

    /*
     * (non-Javadoc)
     * @see com.amuse.event.DoorEventListener#onDoorEvent(com.amuse.event.DoorEvent)
     */
    @Override
    public void handleDoorEvent(DoorEvent event) {

        if ((event != null) && (event.getDoorState().equals("open"))) {
            System.out.println("the door are opened!-------->in listener2---->事件源" + event.getSource()”);
        } else {
            System.out.println("the door are closed!--------->in listener2---->事件源" + event.getSource()“);
        }

    }

}

 

 事件源类:

 

package com.amuse.event;

import java.util.Vector;

/**
 * 类DoorManager.java的实现描述:DoorManager.java
 * <p>
 * 事件源
 * 
 * @author yongchun.chengyc 2012-3-13 下午5:28:47
 */
public class DoorEventSource {

    // 这个是模仿java.util.Observable类的
    private Vector<DoorEventListener> listeners;

    // 注册监听者
    public synchronized void addDoorListener(DoorEventListener listener) {
        if (listener != null) {
            listeners.add(listener);
        }
    }

    // 撤销监听者
    public synchronized void removeDoorListener(DoorEventListener listener) {
        if (listener != null) {
            listeners.remove(listener);
        }
    }

    // 事件处罚器
    protected void fireWorkspaceOpened() {
        if (listeners == null) {
            return;
        }
        DoorEvent event = new DoorEvent(this, "open");
        notifyListeners(event);
    }

    // 事件处罚器
    protected void fireWorkspaceClosed() {
        if (listeners == null) {
            return;
        }
        DoorEvent event = new DoorEvent(this, "closed");
        notifyListeners(event);
    }

    // 触发事件
    private synchronized void notifyListeners(DoorEvent event) {
        for (DoorEventListener listener : listeners) {
            listener.handleDoorEvent(event);
        }

    }

    /**
     * @return the listeners
     */
    public Vector<DoorEventListener> getListeners() {
        return listeners;
    }

    /**
     * @param listeners the listeners to set
     */
    public void setListeners(Vector<DoorEventListener> listeners) {
        this.listeners = listeners;
    }

    public int getListenerNum() {
        if (listeners != null) {
            return listeners.size();
        }
        return 0;
    }

}

 

 测试类:

 

package com.amuse.event;

import java.util.Vector;

/**
 * 类DoorMainTest.java的实现描述:DoorMainTest.java
 * @author yongchun.chengyc 2012-3-13 下午5:40:11
 */
public class DoorMainTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        DoorEventSource source = new DoorEventSource();
        source.setListeners(new Vector<DoorEventListener>());
        DoorEventListener1 listener1 = new DoorEventListener1();
        source.addDoorListener(listener1);
        long time1 = listener1.beforeHandleDoorEvent() - listener1.afterHandlerDoorEvent();
        System.out.println(time1);
        DoorEventListener2 listener2 = new DoorEventListener2();
        source.addDoorListener(listener2);
        long time2 = listener2.beforeHandleDoorEvent() - listener2.afterHandlerDoorEvent();
        System.out.println(time2);
        source.fireWorkspaceOpened();
        source.fireWorkspaceClosed();

    }

}

 输出结果为:

 

0
0
the door are opened!-------->in listener1---->事件源com.amuse.event.DoorEventSource@3d4b7453
the door are opened!-------->in listener2---->事件源com.amuse.event.DoorEventSource@3d4b7453
the door are closed!-------->in listener1---->事件源com.amuse.event.DoorEventSource@3d4b7453
the door are closed!--------->in listener2---->事件源com.amuse.event.DoorEventSource@3d4b7453
 

 

观察者模式的实例见另外一位同学的文章:http://www.iteye.com/topic/102068

分享到:
评论

相关推荐

    java事件模型详解

    一个台湾网站找到的java事件方面的资料,感觉挺好,与大家分享!

    Java 开发中事件驱动模型的实例详解

    在Java开发领域,事件驱动模型(Event-Driven Model)是一种广泛采用的设计模式,它通过响应外部事件来触发程序中的特定行为。本文将深入探讨Java中事件驱动模型的应用,特别是通过Swing框架的具体实例来解析这一...

    事件驱动模型实例详解(Java篇)

    ### 事件驱动模型实例详解(Java篇) #### 1. 事件驱动模型概念解析 事件驱动模型是现代软件开发中一种关键的编程模式,尤其在图形用户界面(GUI)编程中占据核心地位。该模型围绕三个核心概念构建:事件源、侦听...

    java事件传递技术

    Java事件模型主要基于观察者模式(Observer Pattern),在这个模型中,事件源(通常是GUI组件)是被观察的对象,而事件监听器则是观察者。当事件源发生特定事件时,会通知注册的监听器,调用监听器中的相应方法。...

    java事件处理编程范例

    Java事件模型基于发布/订阅模式,其中事件源(如按钮或文本框)是发布者,而事件监听器是订阅者。当事件发生时,事件源会触发事件,并通知已注册的监听器。Java Swing和JavaFX提供了丰富的组件库,这些组件都可以...

    Java 内存模型

    Java内存模型是Java虚拟机规范中定义的一部分,它规定了Java程序中变量的读写行为,以及线程之间的交互规则。理解Java内存模型对于编写正确、高效的多线程程序至关重要。在Java 5之前,Java内存模型的描述比较模糊,...

    java 内存模型 java 内存模型

    java 内存模型 java 内存模型 java 内存模型 java 内存模型

    java事件例子

    Java事件模型主要基于观察者模式,其中事件源(通常是组件,如按钮、文本框等)是被观察的对象,而事件监听器则是观察者,负责处理由事件源触发的事件。Java AWT和Swing库提供了丰富的组件和事件类来支持这一机制。 ...

    java事件实例下载

    java 事件 实例 java事件 事件学习 简单的java事件模型,有注释 java 事件 实例 java事件 事件学习 简单的java事件模型,有注释 java 事件 实例 java事件 事件学习 简单的java事件模型,有注释

    Java中事件的详细底层实现

    随着Java版本的不断更新,事件处理模型也经历了从Java 1.0时代的事件模型到Java 1.1及后续版本中的事件委派模型(Event Delegation Model)的转变。 ##### 1.1 Java事件委派模型概述 事件委派模型是Java 1.1之后引入...

    Java的Events事件实例

    Java的事件模型支持多种类型的事件,包括鼠标事件、键盘事件、窗口事件等。在GUI编程中,熟练掌握事件处理机制是构建交互式应用的关键。`events-BeeperProject`这样的实例提供了实践机会,帮助开发者了解如何在实际...

    Java事件处理机制教学方法探讨.zip

    7. **事件分发机制**:Java事件模型采用多路复用(多播)的方式,一个事件可以被多个监听器处理。事件源会将事件发送给所有已注册的监听器。 8. **Swing事件与AWT事件**:虽然Swing是建立在AWT之上的,但它的事件...

    事件模型探究及配套源码

    本文将深入探讨事件模型的各个方面,包括函数指针的进化、Java、.NET(C#)、DOM与JavaScript以及Flex和ActionScript3的事件模型。 首先,函数指针进化论讲述了编程中处理函数引用的方式如何演变。早期的编程语言中...

    新安江模型java_Java_新安江模型

    新安江模型:三层蒸发模型、三水源划分产流

    JAVA AWT事件模型教学实例

    JAVA AWT事件模型是Java图形用户界面开发的基础部分,它主要负责处理用户的交互操作,如鼠标点击、键盘输入等。在AWT(Abstract Window Toolkit)中,事件模型采用了一种称为"冒泡"的机制,即事件从底层组件开始,...

    深入理解Java内存模型 pdf 超清版

    Java内存模型,简称JMM(Java Memory Model),是Java编程语言规范的一部分,它定义了程序中各个线程如何访问和修改共享变量,以及如何确保数据的一致性。深入理解Java内存模型对于编写高效的并发程序至关重要。本文...

    深入理解Java内存模型

    Java内存模型是并发编程中一个至关重要的概念,它定义了共享变量的访问规则,以及这些变量如何在多线程环境下进行读写操作。在深入理解Java内存模型之前,我们需要先了解并发编程模型的分类,然后掌握Java内存模型的...

    Java教程之AWT事件模型

    Java教程之AWT事件模型

    cpu 内存模型和java内存模型

    Java程序员了解CPU以及相关的内存模型,对于深入理解Java内存模型以及并发编程至关重要。CPU作为计算机硬件的核心,其架构和工作原理影响着软件的性能和执行效率。尤其在Java这种多线程、高并发的编程语言中,对CPU...

    Java的事件处理模型

    事件处理模型(一看就懂) 2.鼠标事件处理 鼠标是一种最常见的输入方式。用户可以用鼠标绘制图形,利用鼠标实现特殊的控制,例如游戏操作的控制等功能。Java语言中主要提供了三种不同类型的鼠标事件: 鼠标键事件; ...

Global site tag (gtag.js) - Google Analytics