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