自定义事件(java)

类别:Java 点击:0 评论:0 推荐:

   好久就想写出来,这段时间都不知道在忙什么,今天好点,写成文吧:)
   开始看到java类中有的addListener()方法,感觉就是一个方法,很简单啊,后来自己想写事件,才发觉这里头还是有些学问的。
   MyChangeEvent.java     事件类,继承了java.util.EventObject
   MyChangeListener.java  监听接口,继承了java.util.EventListener
   MyClass.java           实现了事件的处理机制
   MyEventTest.java       Junit的测试

/*
 * Created on Nov 26, 2004 11:25:14 PM
 *
 * MyChangeEvent.java
 **/
package org.yz21.study.event;

import java.util.EventObject;

/**
 * @author violin
 *
 *  Copyright www.yz21.org 2003-2004
 */
public class MyChangeEvent extends EventObject {
 
 private String myname;

 /**
  * @param source
  */
 public MyChangeEvent(Object source) {
  super(source);
 }
 
 /*
  * @param source myname
  */
 public MyChangeEvent(Object source,String myname) {
  super(source);
  this.myname = myname;
 }
 
 /*
  * @return String
  */
 public String getMyname() {
  return myname;
 }

}


/*
 * Created on Nov 26, 2004 11:27:55 PM
 *
 * MyChangeListener.java
 **/
package org.yz21.study.event;

import java.util.EventListener;

/**
 * @author violin
 *
 *  Copyright www.yz21.org 2003-2004
 */
public interface MyChangeListener extends EventListener {
 /*
  * @param event
  */
 public void MyChanged(MyChangeEvent event);

}


/*
 * Created on Nov 26, 2004 11:32:01 PM
 *
 * MyClass.java
 **/
package org.yz21.study.event;

import java.util.Iterator;
import java.util.Vector;

/**
 * @author violin
 *
 *  Copyright www.yz21.org 2003-2004
 */
public class MyClass {

 private String name = "2004-9-27";
 private static Vector myChangeListeners = new Vector();

 /**
  *
  */
 public MyClass() {
  super();
 }

 /*
  * @param myname
  */
 public void testMyEvent(String myname) {
  this.name = myname;
  notifyMyChangeListeners();
 }
 
 /*
  * @param listener   add a listener;
  */
 public void addMyChangeListener(MyChangeListener listener) {
  myChangeListeners.add(listener);
 }
 
 /*
  * @param listener   remove a listener;
  */
 public void removeMyChangeListener(MyChangeListener listener) {
  myChangeListeners.remove(listener);
 }
 
 /*
  * notify all listeners;
  */
 private  void notifyMyChangeListeners() {
  MyChangeEvent event = new MyChangeEvent(MyClass.class, name);
  Iterator iterator = ((Vector) myChangeListeners.clone()).iterator();

  while (iterator.hasNext()) {
   MyChangeListener listener = (MyChangeListener) iterator.next();
   listener.MyChanged(event);
  }
 }
}


/*
 * Created on Nov 26, 2004 11:47:04 PM
 *
 * MyEventTest.java
 **/
package org.yz21.study.event;

import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

/**
 * @author violin
 *
 *  Copyright www.yz21.org 2003-2004
 */
public class MyEventTest extends TestCase implements MyChangeListener {
 
 private MyClass myclass;
 private String testname;

 /**
  * Constructor for MyEventTest.
  * @param arg0
  */
 public MyEventTest(String arg0) {
  super(arg0);
 }

 public static void main(String[] args) {
  junit.textui.TestRunner.run(MyEventTest.class);
 }

 /*
  * @see TestCase#setUp()
  */
 protected void setUp() throws Exception {
  myclass = new MyClass();
  myclass.addMyChangeListener(this);
  this.testname = "yz21.org";
 }

 /*
  * @see TestCase#tearDown()
  */
 protected void tearDown() throws Exception {
  myclass = null;
 }
 
 /*
  * @see TestCase#suite()
  */
 public static Test suite() {
  return new TestSuite(MyEventTest.class); //以类为参数
 }
 
 public void MyChanged(MyChangeEvent event) {
  this.testname = event.getMyname();
 }
 
 public void testMyEvent() {
  myclass.testMyEvent("www.yz21.org");
  this.assertEquals("测试事件","www.yz21.org",testname);
 }
}


参考资料:
          1、java docs
          2、Apache Jmeter
          3、Junit docs

本文地址:http://com.8s8s.com/it/it13102.htm