java自定义监听器的示例代码

来源:互联网 发布:七天网络教师登录 编辑:程序博客网 时间:2024/06/09 19:07

JAVA用户自定义事件监听完整例子- ---sunfruit     很多介绍用户自定义事件都没有例子,或是例子不全,下面写了一个完整的例子,并写入了注释以便参考,完整的实例源代码如下:

package demo;import java.util.EventObject;/*** 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();}}


原创粉丝点击