事件一共有三个主体。
1.事件源(Source Object),事件的发起者。
2.监听器(Listener),监听事件的人。
3.事件(Event)本身。
举个栗子:
你在看某个漂亮小姐姐的直播,当这个小姐姐给你唱了首歌的时候,你给他打赏了一个土豪飞机礼物。
1.上面这句话中,小姐姐是事件源,而你则是监听器,监听着小姐姐。
2.小姐姐唱歌了,你则打赏了礼物。这两个步骤是一个连贯的事情,而这个事情可以清楚的知道事件源和做出反应的人是谁。
流程:在事件源中注册监听器,当满足了一定条件之后调用监听器的方法,创建一个事件对象作为参数传进去。而事件对象中记录了事件源
java.util.EventListener
所有监听器必须实现该接口,该接口没有任何方法只是一个规范。
java.util.EventObject
该类为事件对象本身。类中有成员变量专门记录事件源。即发起事件的对象。
/**
* 事件源
*
* Created by Max on 2017/8/11.
*/
public class XiaoJieJie {
//注册事件
private EventListener eventListener;
private int age;
XiaoJieJie(){};
XiaoJieJie(EventListener eventListener){
this.eventListener = eventListener;
}
//唱歌
public void sing(){
++age;
if(eventListener != null){
//调用注册器方法。新建事件对象,当前对象为事件源。
((MyEventListener)eventListener).daShang(new MyEvent(this));
}
}
public EventListener getEventListener() {
return eventListener;
}
public void setEventListener(EventListener eventListener) {
this.eventListener = eventListener;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
/**
* 监听器
*
* Created by Max on 2017/8/11.
*/
public class MyEventListener implements EventListener {
//监听着
private String name;
MyEventListener(String name){
this.name = name;
}
//打赏方法
void daShang(MyEvent event){
System.out.println("小姐姐唱歌了," + name + "打赏土豪飞机礼物了~");
}
}
/**
* 事件对象,作为参数传给监听器,事件对象中记录了事件源。
*
* Created by Max on 2017/8/11.
*/
public class MyEvent extends EventObject {
/**
* Constructs a prototypical Event.
*
* @param source The object on which the Event initially occurred.
* @throws IllegalArgumentException if source is null.
*/
public MyEvent(Object source) {
super(source);
}
//获取事件源
public Object getEventSource(){
return getSource();
}
}
public class Test {
public static void main(String[] args) {
XiaoJieJie p = new XiaoJieJie(new MyEventListener("张三"));
p.sing();//输出 小姐姐唱歌了,张三打赏土豪飞机礼物了~
}
}
监听一件事情是可以被代理的,有一天你有事情,晚上不能给小姐姐打赏,但是你可以让你室友来帮你做这件事情。
让他来帮你打赏,要注意的是,此时事情的发起者是小姐姐,逻辑上来说意图监听这件事情的人还是你,只不过你室友在帮你监听而已。
java.util.
EventListenerProxy<T extends EventListener>
该抽象类可以帮你代理你自定义的事件。
/** * 事件注册代理 * * Created by Max on 2017/8/11. */ public class MyEventListenerProxy extends EventListenerProxy<MyEventListener> { //代理者 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } /** * Creates a proxy for the specified listener. * * @param listener the listener object */ public MyEventListenerProxy(MyEventListener listener) { super(listener); } public void register(XiaoJieJie p){ p.setEventListener(getListener()); } }
public class Test { public static void main(String[] args) { // XiaoJieJie p = new XiaoJieJie(new MyEventListener("张三")); // p.sing();//输出 小姐姐唱歌了,张三打赏土豪飞机礼物了~ XiaoJieJie p1 = new XiaoJieJie(); //李四基友帮助李四完成打赏这件事情。 MyEventListenerProxy eventListenerProxy = new MyEventListenerProxy(new MyEventListener("李四")); eventListenerProxy.setName("李四基友"); eventListenerProxy.register(p1); p1.sing();//输出 小姐姐唱歌了,李四打赏土豪飞机礼物了~ } }