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. 【转】Mysql中varchar存放中文与英文所占字节异同

    本文转自Ruby china, 原文地址:https://ruby-china.org/topics/24920 一.关于UTF-8 UTF-8 Unicode Transformation Form ...

  2. &与&&的区别

    &是“逻辑与”(“按位与”“位运算符”),一定要判断完所有的条件才能确定到底返回true还是false. &&是“短路与”(“逻辑运算符”),当从左至右判断时,一旦出现有一个条 ...

  3. ijg库的使用的几点注意

    ijg库(http://www.ijg.org/)是用于处理jpeg解码和压缩的库,最新版本为2014发布的版本,可以在官网中下载jpegsr9a.zip 使用vs中个nmake 进行编译,对于这个版 ...

  4. vuex是啥

    vuex是一个状态管理工具. vuex store与一个简单的全局变量的区别是: 1.vuex stores 是响应式的,当组件改变state时,它能响应并高效地更新state. 2.state不能被 ...

  5. redis初步入门

    http://blog.csdn.net/u014419512/article/details/25693425 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] 环境 安装 ...

  6. Java 并发和多线程(二) 多线程的优点 [转]

    原文:http://tutorials.jenkov.com/java-concurrency/benefits.html 作者:Jakob Jenkov        翻译:古圣昌         ...

  7. iOS开发UI篇—控制器的创建

    iOS开发UI篇—控制器的创建 说明:控制器有三种创建方式,下面一一进行说明. 一.第一种创建方式(使用代码直接创建) 1.创建一个空的IOS项目. 2.为项目添加一个控制器类. 3.直接在代理方法中 ...

  8. [安卓]windows下如何安装Android源码

    本文改写于:http://www.cnblogs.com/skyme/archive/2011/05/14/2046040.html 1.下载并安装git: 在git-scm.com上下载并安装git ...

  9. FileWriter和FileReader简单使用

    FileWriter和FileReader使用 package com.main.test; import java.io.FileNotFoundException; import java.io. ...

  10. excel具有制作甘特图的功能

    1.Excel最大功能:数据处理.统计分析. 2.数据有效性验证: 长数字输入方法,文本前面加英文"'"(单引号)或使用文本转换. 身份证号:数据.数据有效性.文本长度. 性别:数 ...