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

    }

    }

  • 相关阅读:
    call apply bind的区别
    Js的继承方法
    JS回调函数 回调地狱问题 以及解决方法
    Js闭包
    Js中的this指向问题
    ES6 Class继承
    面向对象
    Vue
    JavaScript数组 字符串的方法
    28.mysql练习
  • 原文地址:https://www.cnblogs.com/wnlja/p/4347716.html
Copyright © 2020-2023  润新知