`
sxpyrgz
  • 浏览: 72799 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

EventListenerList 实例

    博客分类:
  • java
阅读更多
package com.hexun.sample;
import javax.swing.event.EventListenerList; 
import java.util.Date; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat;

/** 
* Java的事件机制/自定义事件.

运行结果: 
do something interesting in source here. 
listener detects [event]:wintys.event.MyEvent[source=wintys.event.MySource@18158 
59] [occur at]:2009-10-11 16:27:49 
listener detects [event]:wintys.event.MyEvent[source=wintys.event.MySource@18158 
59] [occur at]:2009-10-11 16:27:49

* @version 2009-10-11 
* @author 天堂露珠 (wintys@gmail.com) 
* @see http://www.blogjava.net/wintys 
*/ 
public class MyEventTest{ 
    public static void main(String[] args){ 
        MySource source = new MySource(); 
        MyListener myListener = new MyListener(){ 
            public void doMyAction(MyEvent e){ 
                System.out.println("listener detects " + e); 
            } 
        }; 
        source.addMyListener(myListener); 
        source.addMyListener(myListener); 
        source.addMyListener(myListener); 
        source.removeMyListener(myListener);

        source.doSomething(); 
    } 
}

/** 
* 自定义的事件. 
* @version 2009-10-11 
* @author 天堂露珠(wintys@gmail.com) 
* @see http://www.blogjava.net/wintys 
*/ 
class MyEvent extends java.util.EventObject{ 
    private Date date;//记录事件发生的时间

    public MyEvent(Object source , Date date){ 
        super(source);

        this.date = date; 
    }

    public String toString(){ 
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
        String dt = df.format(date);

        return "[event]:" + super.toString() + " [occur at]:" + dt; 
    } 
}

/** 
* 自定义事件监听器接口. 
* @version 2009-10-11 
* @author 天堂露珠(wintys@gmail.com) 
* @see http://www.blogjava.net/wintys 
*/ 
interface MyListener extends java.util.EventListener{ 
    void doMyAction(MyEvent e); 
}

/** 
* 自定义事件源. 
* @version 2009-10-11 
* @author 天堂露珠(wintys@gmail.com) 
* @see http://www.blogjava.net/wintys 
*/ 
class MySource{ 
    /** 
     * 保存注册的监听器列表. 
     * 子类可以使用它保存自己的事件监听器(非MyListener监听器)列表. 
     */ 
    protected EventListenerList listenerList = new EventListenerList(); 
    private MyEvent myEvent = null;//fireDoMyAction()使用此变量

    /** 
     * 没有做任何事 
     */ 
    public MySource(){ 
    } 
    /** 
     * 添加一个MyListener监听器 
     */ 
    public void addMyListener(MyListener listener){ 
        listenerList.add(MyListener.class , listener); 
    }

    /** 
     * 移除一个已注册的MyListener监听器. 
     * 如果监听器列表中已有相同的监听器listener1、listener2, 
     * 并且listener1==listener2, 
     * 那么只移除最近注册的一个监听器。 
     */ 
    public void removeMyListener(MyListener listener){ 
        listenerList.remove(MyListener.class , listener); 
    }

    /** 
     * @return 在此对象上监听的所有MyListener类型的监听器 
     */ 
    public MyListener[] getMyListeners(){ 
        return (MyListener[])listenerList.getListeners(MyListener.class); 
    }

    //Winty:Copy directly from javax.swing.event.EventListenerList 
    /*Notify all listeners that have registered interest for 
       notification on this event type. The event instance 
       is lazily created using the parameters passed into 
       the fire method. 
     */ 
    protected void fireDoMyAction() { 
         // getListenerList() Guaranteed to return a non-null array 
         Object[] listeners = listenerList.getListenerList(); 
         // Process the listeners last to first, notifying 
         // those that are interested in this event 
        for (int i = listeners.length-2; i>=0; i-=2) { 
            if (listeners[i]==MyListener.class) { 
                // Lazily create the event: 
                if (myEvent == null) 
                    myEvent = new MyEvent(this , new Date()); 
                ((MyListener)listeners[i+1]).doMyAction(myEvent); 
            } 
        } 
    }

    /** 
     * 做一些事件源应该做的有意义的事,然后通知监听器. 
     * 这里只是一个示例方法. 
     * 例如:MySource如果是一个按钮,则doSomething()就可以命名为click(), 
     * 当用户点击按钮时调用click()方法. 
     */ 
    public void doSomething() { 
        System.out.println("do something interesting here.");

        fireDoMyAction();//通知监听器 
    } 
}
http://apps.hi.baidu.com/share/detail/18575799

 

分享到:
评论

相关推荐

    oracle删除和重建实例

    删除和重建 Oracle 实例 Oracle 数据库是一种关系型数据库管理系统,广泛应用于企业级数据库应用中。然而,在某些情况下,我们需要删除和重建 Oracle 实例,以便解决一些问题或进行升级维护。在这篇文章中,我们将...

    Proteus单片机仿真实例源码大全C51单片机Proteus仿真例程学习实例源代码(150例).zip

    Proteus单片机仿真实例源码-32x16汉字.zip Proteus单片机仿真实例源码-44行列键盘.rar Proteus单片机仿真实例源码-44行列键盘.zip Proteus单片机仿真实例源码-485全双工通信.rar Proteus单片机仿真实例源码-485全...

    OpenGL实例 OpenGL实例 OpenGL实例 OpenGL实例 OpenGL实例

    OpenGL实例 OpenGL实例 OpenGL实例 OpenGL实例 OpenGL实例

    Visual C# .NET精彩编程实例集锦

    实例1 如何使用错误提醒控件 实例2 如何使用信息提示控件 实例3 如何使用菜单控件 实例4 如何使用工具栏控件 实例5 如何使用状态栏控件 实例6 如何使用托盘控件 实例7 如何使用标签页控件 实例8 如何使用进度条控件 ...

    sqlserver2008R2应用添加实例步骤

    ### SQL Server 2008 R2 添加实例的详细步骤 #### 一、概述 SQL Server 2008 R2 是一款强大的关系型数据库管理系统,广泛应用于企业级数据管理和处理场景。对于需要在同一台服务器上运行多个独立的SQL Server环境...

    QT5开发及实例配套源代码.zip

    QT5开发及实例配套[源代码] Qt是诺基亚公司的C++可视化开发平台,本书以Qt 5作为平台,每个章节在简单介绍开发环境的基础上,用一个小实例,介绍Qt 5应用程序开发各个方面,然后系统介绍Qt 5应用程序的开发技术,...

    数据结构实例(内含17个详细经典实例)

    数据结构实践教程:内含17个经典数据结构实例 根据五个不同数据结构,对每个结构都有2~4个经典实例。每个实例都有项目简介、设计思路、数据结构、完整程序、运行结果五个部分,可以直接拿来做一篇课程设计。实例名称...

    j2ee实例 j2ee实例j2ee实例

    本实例集合将深入探讨J2EE的核心概念和技术,帮助开发者更好地理解和应用J2EE。 首先,J2EE的核心组件包括Servlet、JavaServer Pages (JSP)、JavaBean、EJB(Enterprise JavaBeans)、JMS(Java Message Service)...

    opengl 实例实例实例实例实例

    opengl 实例实例实例实例实例opengl 实例实例实例实例实例

    java对象与类实例java对象与类实例java对象与类实例java对象与类实例java对象与类实例java对象与类实例java

    java对象与类实例java对象与类实例java对象与类实例java对象与类实例java对象与类实例java对象与类实例java对象与类实例java对象与类实例java对象与类实例java对象与类实例java对象与类实例java对象与类实例java对象...

    labview55个经典实例

    下面我们将围绕"LabVIEW 55个经典实例"这一主题,探讨这些实例可能涵盖的知识点,以及它们如何帮助用户提升LabVIEW技能。 1. **基础编程概念**:这55个实例可能会包含基础的编程概念,如循环(For Loop, While Loop...

    《Visual Basic 2008应用程序开发实例精讲》全书所有实例程序源代码

    第2篇 数据库应用开发实例 第3章 家庭理财系统54 3.1 实例功能说明54 3.2 系统设计方案55 3.2.1 模块设计及开发环境55 3.2.2 系统结构图55 3.2.3 数据库设计56 3.3 相关技术点拨58 3.3.1 ado.net数据库访问技术58 ...

    MCGS高级教程实例模板

    MCGS高级教程实例模板MCGS高级教程实例模板MCGS高级教程实例模板MCGS高级教程实例模板MCGS高级教程实例模板MCGS高级教程实例模板MCGS高级教程实例模板MCGS高级教程实例模板MCGS高级教程实例模板MCGS高级教程实例模板...

    js实例大全 js实例

    本"JS实例大全"聚焦于展示JavaScript在实际应用中的各种功能和技巧,帮助开发者更好地理解和掌握这门语言。 一、基础语法与数据类型 JavaScript的基础语法包括变量声明(var、let、const)、数据类型(如字符串、...

    C++编程实例100篇

    《C++编程实例100篇》是一本深入浅出的C++编程教程,它以实践为主导,通过丰富的实例帮助学习者掌握C++语言的基础和核心概念。这本书的每个实例都精心设计,旨在帮助初学者和有经验的开发者巩固和提升C++编程技能。 ...

    最新单片机仿真 8255并行口扩展实例

    最新单片机仿真 8255并行口扩展实例最新单片机仿真 8255并行口扩展实例最新单片机仿真 8255并行口扩展实例最新单片机仿真 8255并行口扩展实例最新单片机仿真 8255并行口扩展实例最新单片机仿真 8255并行口扩展实例...

    sakuracat简介及应用实例及实例分析.txt简介及应用实例及实例分析.txt

    githubsakuracat简介及应用实例及实例分析.txt简介及应用实例及实例分析.txtsakuracat简介及应用实例及实例分析.txt简介及应用实例及实例分析.txtsakuracat简介及应用实例及实例分析.txt简介及应用实例及实例分析....

    51单片机Proteus仿真实例 闪烁LED

    51单片机Proteus仿真实例 闪烁LED51单片机Proteus仿真实例 闪烁LED51单片机Proteus仿真实例 闪烁LED51单片机Proteus仿真实例 闪烁LED51单片机Proteus仿真实例 闪烁LED51单片机Proteus仿真实例 闪烁LED51单片机...

    Zemax设计实例500.zip

    《Zemax设计实例500.zip》是一款包含大量光学设计实例的资源包,对于学习和提升光学设计技能的初学者及专业人士来说极具价值。Zemax是业界广泛使用的光学设计软件,它提供了强大的优化和分析工具,使得复杂光学系统...

Global site tag (gtag.js) - Google Analytics