JAVA事件响应机制
1,先自定义一个事件
public class MyEvent extends java.util.EventObject{
public MyEvent(Object source)
{
super(source);
}
}
2,再自定义一个监听器
public class MyListener implements java.util.EventListener{
//这里是当事件发生后的响应过程
public void EventActivated(MyEvent me)
{
System.out.println("事件已经被触发");
}
}
3,以下这个类为触发事件的事件源
public class MyObject {
private Vector vectorListeners=new Vector();
public synchronized void addMyListener(MyListener ml)
{
vectorListeners.addElement(ml);
}
public synchronized void removeMyListener(MyListener ml)
{
vectorListeners.removeElement(ml);
}
protected void activateMyEvent()
{
Vector tempVector=null;
MyEvent e=new MyEvent(this);
synchronized(this)
{
tempVector=(Vector)vectorListeners.clone();
for(int i=0;i
{
MyListener ml=(MyListener)tempVector.elementAt(i);
ml.EventActivated(e);
}
}
}
//定义一个公用方法用于触发事件
public void test()
{
activateMyEvent();
}
}
4,测试类
public class Test {
public static void main(String[] args)
{
MyObject mo=new MyObject();
//注册该事件
mo.addMyListener(new MyListener());
//触发该事件
mo.test();
}
}
观察者模式-Java自定义事件
import
java.util.EventObject;
/**
* Title: 事件处理类,继承了事件基类
* Description:
* Copyright: Copyright (c) 2005 Company:
* cuijiang
*
*
@author not attributable
*
@version 1.0
*/
public
class
DemoEventextends
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
com.te.event.other;
import
java.util.EventListener;
/**
* Title: 监听器接口
* Description:
* Copyright: Copyright (c) 2005
* Company: cuijiang
*
@author not attributable
*
@version 1.0
*/
public
interface
DemoListenerextends
EventListener{
public
void demoEvent(DemoEvent dm);
}
package
com.te.event.other;
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 enu = repository.elements();
//
这步要注意同步问题
while (enu.hasMoreElements()) {
dl = (DemoListener) enu.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.te.event.other;
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();
}
}