http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f733628a854d2c90c05f93130716017bb2e1707e4e5f8099297a52ef0f07bbae61332a032ab59bc2835dddccc86e70d633712d5cd04e4a805dfcdc4654d651e34d98af0e97cbe746e4b9d3a3c82551dd27736df6f59c2c01&p=90769a478e9711a05bed90665907bb&newp=9877c54ad5c345f32aa5c7710f0c9d231610db2151d4d51323a6db&user=baidu&fm=sc&query=java+%CA%C2%BC%FE%C0%FD%D7%D3&qid=b67957270000b424&p1=10

/** *//**
* Title: 事件处理类,继承了事件基类
* Description: 
* Copyright: Copyright (c) 2005
* Company: cuijiang
* @author not attributable
* @version 1.0
*/
public class DemoEvent extends EventObject
{
   private Object obj;
   private String sName;
   public DemoEvent(Object source,String sName)   {
     super(source);
     obj = source;
     this.sName=sName;
   }
   public Object getSource()
   {
     return obj;
   }
   public void say()
   {
     System.out.println("这个是 say 方法");
   } 

   public String getName()
   {
     return sName;
   }
}


package demo;

import java.util.EventListener;

/** *//**
* Title: 监听器接口
* Description: 
* Copyright: Copyright (c) 2005
* Company: cuijiang
* @author not attributable
* @version 1.0
*/
public interface DemoListener extends EventListener{
   public void demoEvent(DemoEvent dm);
}


package demo;
import java.util.*;

/** *//**
* Title: 使用事件的类
* Description: 该类实现了监听器的添加和监听器方法的执行,并且实现了由于属性的改变而执行事件
* Description: 在添加、删除、执行监听器的时候都要注意同步问题
* Copyright: Copyright (c) 2005
* Company: cuijiang
* @author not attributable
* @version 1.0
*/
public class DemoSource{
   private Vector repository = new Vector();
   private DemoListener dl;
   private String sName=""; 

   public DemoSource()
   {
   }

   //注册监听器,如果这里没有使用Vector而是使用ArrayList那么要注意同步问题
   public void addDemoListener(DemoListener dl)
   {
     repository.addElement(dl);//这步要注意同步问题
   }

   //如果这里没有使用Vector而是使用ArrayList那么要注意同步问题
   public void notifyDemoEvent(DemoEvent event) {
     Enumeration enum = repository.elements();//这步要注意同步问题
     while(enum.hasMoreElements())
     {
       dl = (DemoListener)enum.nextElement();
       dl.demoEvent(event);
     }
   }

   //删除监听器,如果这里没有使用Vector而是使用ArrayList那么要注意同步问题
   public void removeDemoListener(DemoListener dl)
   {
     repository.remove(dl);//这步要注意同步问题
   }

   /** *//**
    * 设置属性
    * @param str1 String
    */
   public void setName(String str1)
   {
     boolean bool=false;
     if(str1==null && sName!=null) bool=true;
     else if(str1!=null && sName==null) bool=true;
     else if(!sName.equals(str1)) bool=true;

     this.sName=str1;

     //如果改变则执行事件
     if(bool) notifyDemoEvent(new DemoEvent(this,sName));
   }

   public String getName()
   {
     return sName;
   }
}


package demo;

import java.lang.Thread;

/** *//**
* Title: 测试类
* Description: 测试了由于改变属性而引起的事件发生
* Copyright: Copyright (c) 2005
* Company: cuijiang
* @author not attributable
* @version 1.0
*/
public class TestDemo
     implements DemoListener {
   private DemoSource ds; 

   public TestDemo()
   {
     ds=new DemoSource();
     ds.addDemoListener(this);
     System.out.println("添加监听器完毕");
     try {
       Thread.sleep(3000);
       //改变属性,触发事件
       ds.setName("改变属性,触发事件");
     }
     catch (InterruptedException ex) {
       ex.printStackTrace();
     }

     ds.addDemoListener(this);
     System.out.println("添加监听器完毕2");
     try {
       Thread.sleep(3000);
       //改变属性,触发事件
       ds.setName("改变属性,触发事件2");
     }
     catch (InterruptedException ex) {
       ex.printStackTrace();
     }

     ds.removeDemoListener(this);
     System.out.println("添加监听器完毕3");
     try {
       Thread.sleep(3000);
       //改变属性,触发事件
       ds.setName("改变属性,触发事件3");
     }
     catch (InterruptedException ex) {
       ex.printStackTrace();
     }


   }

   public static void main(String args[])
   {

     new TestDemo();
   }

   /** *//**
    * demoEvent
    *
    * @param dm DemoEvent
    * @todo Implement this test.DemoListener method
    */
   public void demoEvent(DemoEvent dm) {
     System.out.println("事件处理方法");
     System.out.println(dm.getName());
     dm.say();
   }
}

JAVA自定义事件监听完整例子---sunfruit[转]的更多相关文章

  1. [问题贴]mui.openWindow+自定义事件监听操作让alert()执行两次

    仔细看,Alert函数执行了两次 共两个页面:index.html和detail.html, detail.html为按钮设置了自定义事件监听(newsId),触发alert. 在index.html ...

  2. Java Spring 自定义事件监听

    ApplicationContext 事件 定义一个context的起动监听事件 import org.springframework.context.ApplicationListener; imp ...

  3. JAVA GUI 事件监听事件 详解 和 案例.

    GUI(图形用户界面) Graphical User Interface(图形用户接口) 用图形的 方式, 来显示 计算机操作的 界面, 这样更方便 更直观. CLI Command Line Use ...

  4. Java GUI 事件监听

    现在使用的仍是AWT的事件模型.涉及到3类对象: Event Source:事件源,即事件发生所在的组件 Event:事件,封装了此次事件的相关信息 Event Listener:事件监听器,监听事件 ...

  5. cocos2d-js 自定义事件监听派发

    熟悉js的dom事件或者flash事件的,基本都能立马明白cc.eventManager的用法. cc.eventManager有两种注册监听器的方式,一种是原生事件,例如 cc.eventManag ...

  6. JAVA Swing 事件监听

    EventListner 接口 它是一个标记接口,每一个监听器接口扩展.这个类定义在java.util包. 类声明 以下是声明java.util.EventListener接口: public int ...

  7. java Gui编程 事件监听机制

    1.     GUI编程引言 以前的学习当中,我们都使用的是命令交互方式: 例如:在DOS命令行中通过javac java命令启动程序. 软件的交互的方式:   1. 命令交互方式    图书管理系统 ...

  8. Java界面编程—事件监听机制

    组件首先要先注册事件处理器,当用户单击组件.移动鼠标或者敲击键盘时都会产生事件(Event),一旦有时间发生,应用程序就会做出对该事件的响应,这些组件就是事件源(Event source). 接受.解 ...

  9. Java事件监听的四种实现方式

    1.事件对象: 一般继承自java.util.EventObject对象,由开发者自行定义. 2.事件源: 就是触发事件的源头,不同的事件源会触发不同的事件类型. 3.事件监听器: 事件监听器负责监听 ...

随机推荐

  1. 关于tomcat会在url末尾自动追加斜杠(/)

    今天,突然发现一个问题, 比如我的请求路径为  http://ip:port/my_project/myapp, 在浏览器中敲入这个地址,然后会显示 http://ip:port/my_project ...

  2. SPSS数据分析——t检验

    SPSS中t检验全都集中在分析—比较均值菜单中.关于t检验再简单说一下,我们知道一个统计结果需要表达三部分内容,即集中性.变异性.显著性. 集中性的表现指标是均值变异的的表现指标是方差.标准差或标准误 ...

  3. Mac下安装Node.js

    今天介绍一下Mac下Node.js的下载安装方法,后面我们安装Bootstrap.Angurlar和jQuery等都是通过Node.js的npm方式的. 1.在必应中搜索“node.js mac”,第 ...

  4. jquery iframe自适应高度[转]

      经典代码 iFrame 自适应高度,在IE6/IE7/IE8/Firefox/Opera/Chrome/Safari通过测试. 很古老的方法: <iframe src="../In ...

  5. CEF使用的几个注意点

    CEF为chrome浏览器的切入其他浏览器中的轻量级框架. 开发的客户端的时候,这是作为界面显示的首先,可以增强客户的易变性,可塑性. 在开发的过程中(侧重于C,C++解决),遇到的几个问题,以及自己 ...

  6. Validate Binary Search Tree [LeetCode]

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  7. State(状态)

    props和state.props是在父组件中指定,而且一经指定,在被指定的组件的生命周期中则不再改变. 对于需要改变的数据,我们需要使用state.般来说,你需要在constructor中初始化st ...

  8. MVC、ORM、CURD、ActiveRecord、单一入口的概念

    MVC MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使用MVC应用程序被分成三个核心部件:模型(M).视图(V).控制器(C),它们各自处理自己的任务. 视图 :视图是用户看到并 ...

  9. python讲一个列表写入excel表中

    连接为http://blog.csdn.net/a491057947/article/details/47614263 http://www.crifan.com/export_data_to_exc ...

  10. 【转载】VMware虚拟机修改硬盘容量大小

    很多人在安装虚拟机系统的时候,为了节省硬盘空间,把硬盘容量设置得较小,可是后来发现硬盘容量不够用了.在VMware中又不能直接修改虚拟机的硬盘容量大小,或者重建虚拟机系统,非常麻烦. 其实在VMwar ...