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

JAVA用户自定义事件监听完整例子



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();

}

}


你可能感兴趣的:(源代码,java监听器)