sunfruit[请访问http://www.fruitres.cn]

--我相信JAVA能走得更远 QQ:316228067

[原创]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();
  }
}

posted on 2006-02-19 17:59 sunfruit 阅读(855) 评论(0)  编辑  收藏 所属分类: JAVA SE & EE


只有注册用户登录后才能发表评论。


网站导航: