今天在学习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");
}
});
}
}
这样,当点击按钮时便会输出 OK pressed 。
现在我们可以自己实现基于事件驱动的程序,下面我们类比上面的程序实现我们自己的事件。
0、相关流程:
实现自己的事件(对应于ActionEvent)---->实现相应的Listener(对应于ActionListener)------->在自定义的类中产生事件(对应于JButton类)-------->使用自定义类(类似于使用JButton)
1、实现自己的事件--------对应于ActionEvent
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()方法获取。可以定义为产生事件的实例。如点击按钮时,获得被点击的按钮实例。
2、实现相应的Listener
public interface MyEventListener extends EventListener{
void HandleMyName(MyEvent ea);
}
这个没什么可说的,就是定义了一个接口。
3、实现自定义的类------可以类比JButton理解
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);
}
}
}
4、最后使用自定义类,可以类比于使用JButton
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();
}
}
5、结果