今天在学习Spring的IoC容器时,看到自定义事件,书上说通过提供一套基于Java SE标准自定义事件类而实现的,对Java的自定义事件很陌生,所以学习一下,特此记忆。
相信接触过Java Swing的人对事件都不会陌生,例如处理按钮点击事件时,我们先要实例化一个JButton,然后为这个按钮添加ActionListener.可以参照以下代码:
public class MyFrame{ //声明一个JButton private JButton button; public MyFrame(){ button = new JButton("OK"); button.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ System.out.println("OK pressed"); } }); } }
现在我们可以自己实现基于事件驱动的程序,下面我们类比上面的程序实现我们自己的事件。
实现自己的事件(对应于ActionEvent)---->实现相应的Listener(对应于ActionListener)------->在自定义的类中产生事件(对应于JButton类)-------->使用自定义类(类似于使用JButton)
public class MyEvent extends EventObject{ private String name; public MyEvent(Object source,String name) { super(source); this.name = name; } public String getName(){ return name; } }这里的MyEvent就相当于ActionEvent,而构造方法中的source可以通过getSource()方法获取。可以定义为产生事件的实例。如点击按钮时,获得被点击的按钮实例。
public interface MyEventListener extends EventListener{ void HandleMyName(MyEvent ea); }
public class UseEvent { //保存所有的listener private ArrayList<MyEventListener> listeners = new ArrayList<MyEventListener>(); //添加Listener public void addMyEventListener(MyEventListener lis){ listeners.add(lis); } //移除Listener public void removeMyEventListener(MyEventListener lis){ listeners.remove(lis); } //产生事件,可以类比JButton的点击 public void generateEvent(){ MyEvent me = new MyEvent(this,"Casin"); notifyListener(me); } //通知所有的Listener,发生了事件 public void notifyListener(MyEvent ea){ for(MyEventListener listener : listeners){ listener.HandleMyName(ea); } } }
public class Test { public static void main(String[] args){ UseEvent use = new UseEvent(); use.addMyEventListener(new MyEventListener(){ @Override public void HandleMyName(MyEvent ea) { // TODO Auto-generated method stub System.out.println("This is a listener" + ea.getName()); } }); use.generateEvent(); } }