分享

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

 孙中熙——路 2011-05-31
java自定义监听器的示例代码
JAVA用户自定义事件监听完整例子


JAVA用户自定义事件监听完整例子- ---sunfruit     很多介绍用户自定义事件都没有例子,或是例子不全,下面写了一个完整的例子,并写入了注释以便参考,完整的实例源代码如下:
package com.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 com.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 static final long serialVersionUID = -8352051534142982085L;
 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 com.Demo;
import java.util.Enumeration;
import java.util.Vector;
/**
 * Title: 使用事件的类 Description: 该类实现了监听器的添加和监听器方法的执行,并且实现了由于属性的改变而执行事件
 * Description: 在添加、删除、执行监听器的时候都要注意同步问题 Copyright: Copyright (c) 2005 Company:
 * cuijiang
 *
 * @author not attributable
 * @version 1.0
 */
public class DemoSource {
 private Vector<DemoListener> repository = new Vector<DemoListener>();
 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<DemoListener> en = repository.elements();// 这步要注意同步问题
  while (en.hasMoreElements()) {
   dl = (DemoListener) en.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 com.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();
 }
}


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多