EventListenerList举例

package testCustomEvent;

import javax.swing.event.EventListenerList;   
import java.util.Date;   
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;   
import java.text.SimpleDateFormat;  
  
/**  
* Java的事件机制/自定义事件. 
 
运行结果:  
do something interesting in source here.  
listener detects [event]:wintys.event.MyEvent[source=wintys.event.MySource@18158  
59] [occur at]:2012-10-11 16:27:49  
listener detects [event]:wintys.event.MyEvent[source=wintys.event.MySource@18158  
59] [occur at]:2012-10-11 16:27:49 
 
* @version 2012-10-11  
* @author germmy(gogogo@gmail.com)  
* @see http://www.blogjava.net/gogogo  
*/   
public class MyEventTestNew implements MyListener{   
    public static void main(String[] args){   
        MySource source = new MySource(); 
        
        ActionListener al=new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.out.println("allllllllllllllll");
			}
        	
        };
        
        MyEventTestNew mtn=new MyEventTestNew();
        source.addMyListener(mtn); 
        source.addMyListener(al);
        source.doSomething();   
    }

	@Override
	public void doMyAction(MyEvent e) {
		 System.out.println("listener detects " + e);   
		
	}   
}  
  
/**  
* 自定义的事件.  
* @version 2012-10-11  
* @author germmy(gogogo@gmail.com)  
* @see http://www.blogjava.net/gogogo  
*/   
class MyEvent extends java.util.EventObject{   
    private Date date;//记录事件发生的时间  
  
    public MyEvent(Object source , Date date){   
        super(source);  
  
        this.date = date;   
    }  
  
    public String toString(){   
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");   
        String dt = df.format(date);  
  
        return "[event]:" + super.toString() + " [occur at]:" + dt;   
    }   
}  
  
/**  
* 自定义事件监听器接口.  
* @version 2012-10-11  
* @author germmy(gogogo@gmail.com)  
* @see http://www.blogjava.net/gogogo  
*/   
interface MyListener extends java.util.EventListener{   
    void doMyAction(MyEvent e);   
}  
  
/**  
* 自定义事件源.  
* @version 2012-10-11  
* @author germmy(gogogo@gmail.com)  
* @see http://www.blogjava.net/gogogo  
*/   
class MySource{   
    /**  
     * 保存注册的监听器列表.  
     * 子类可以使用它保存自己的事件监听器(非MyListener监听器)列表.  
     */   
    protected EventListenerList listenerList = new EventListenerList();   
    private MyEvent myEvent = null;//fireDoMyAction()使用此变量  
  
    /**  
     * 没有做任何事  
     */   
    public MySource(){   
    }   
    /**  
     * 添加一个MyListener监听器  
     */   
    public void addMyListener(MyListener listener){   
        listenerList.add(MyListener.class , listener);   
    }  
    
    /**  
     * 添加一个MyListener监听器  
     */   
    public void addMyListener(ActionListener al){   
        listenerList.add(ActionListener.class , al);   
    }  
  
    /**  
     * 移除一个已注册的MyListener监听器.  
     * 如果监听器列表中已有相同的监听器listener1、listener2,  
     * 并且listener1==listener2,  
     * 那么只移除最近注册的一个监听器。  
     */   
    public void removeMyListener(MyListener listener){   
        listenerList.remove(MyListener.class , listener);   
    }  
  
    /**  
     * @return 在此对象上监听的所有MyListener类型的监听器  
     */   
    public MyListener[] getMyListeners(){   
        return (MyListener[])listenerList.getListeners(MyListener.class);   
    }  
  
    
     */   
    protected void fireDoMyAction() {   
         // getListenerList() Guaranteed to return a non-null array   
         Object[] listeners = listenerList.getListenerList();   
         // Process the listeners last to first, notifying   
         // those that are interested in this event   
        for (int i = listeners.length-2; i>=0; i-=2) {   
            if (listeners[i]==MyListener.class) {   
                // Lazily create the event:   
                if (myEvent == null)   
                    myEvent = new MyEvent(this , new Date());   
                ((MyListener)listeners[i+1]).doMyAction(myEvent);   
            }  else if(listeners[i]==ActionListener.class) {
            	System.out.println("hahahahahaha");
            }
        }   
    }  
  
    /**  
     * 做一些事件源应该做的有意义的事,然后通知监听器.  
     * 这里只是一个示例方法.  
     * 例如:MySource如果是一个按钮,则doSomething()就可以命名为click(),  
     * 当用户点击按钮时调用click()方法.  
     */   
    public void doSomething() {   
        System.out.println("do something interesting here.");  
  
        fireDoMyAction();//通知监听器   
    }   
}  
 

 

eventListener里面其实是一个数组,将MyListener.class,ml分别放在数组的倒数第二位和倒数第一位。

 

这就是为什么在遍历listenerList时,数组要加2的原因。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值