您的位置:首页 > 编程语言 > Java开发

JAVA中的自定义事件

2012-11-27 15:14 162 查看
http://blog.csdn.net/archer_xy/article/details/7221864

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();
}
}
http://blog.sina.com.cn/s/blog_4ae536e401008g9b.html
自定义事件在java中很有用处,比如我们写一个短信接口程序,在发送短信后触发一个事件,接收短信的时候再触发另外一个时间。而这些事件都必须自己去实现。那么如何实现自定义的事件呢?首先我们必须了解EventObject和EventListener两个对象。EventObject类是所有事件都必须继承的。接口EventListener用来实现我们自己的监听器。

首先我们先定义自己的事件吧。




在这个类里面,我们继承了EventObject类,初始化了事件源,重写了获得事件源的方法。
然后我们需要定义自己的事件监听器。



这里定义的方法便是事件发生时调用的方法。需要重新实现。
接下来,我们需要定义一个事件源类。也就是相当于button之类的对象。



在这里需要注意的是,存储监听器的集合对象必须是线程安全的。
然后我们便可以写测试类来测试事件了。



执行之后,控制台打印"test_event"。ok!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: