当前位置 博文首页 > 程序员石磊:【转】java自定义监听器的示例代码(转载)

    程序员石磊:【转】java自定义监听器的示例代码(转载)

    作者:[db:作者] 时间:2021-08-08 19:22

    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);
    ????? //改变属性,触发事件