【发布时间】:2020-03-30 13:26:01
【问题描述】:
我找不到这个问题的答案。 什么是 java.util.EventListener?它是如何工作的? 我已经在google上做了一些研究,但是我只发现了这个,不是很清楚:所有事件监听器接口都必须扩展的标记接口。
有人可以帮忙吗?
【问题讨论】:
标签: java event-listener
我找不到这个问题的答案。 什么是 java.util.EventListener?它是如何工作的? 我已经在google上做了一些研究,但是我只发现了这个,不是很清楚:所有事件监听器接口都必须扩展的标记接口。
有人可以帮忙吗?
【问题讨论】:
标签: java event-listener
侦听器是一个包含在某些操作发生时调用的方法的类。
java.util.EventListener 是一个标记接口(一个没有任何方法的接口),所有监听器都应该实现。
事实上,它甚至没有添加任何功能,但它可能对某些 IDE 和代码分析工具有所帮助。
因此,如果您想创建自己的自定义事件(由您触发),则需要在事件发生时以某种方式调用所有侦听器方法。
例如,您可以这样做:
首先,您为侦听器创建一个扩展 EventListener 的接口:
public interface MyListener extends EventListener{
void onEvent();
}
然后,您需要创建一种机制来注册和调用所有事件:
private Collection<MyListener> listeners=new HashSet<>();
public void register(MyListener listener){
listeners.add(listener);
}
public void eventHappens(){
for(MyListener listener:listeners){
listener.onEvent();
}
}
然后,您可以使用创建侦听器
public class MyListenerImpl implements MyListener{
private String msg;
public MyListenerImpl(String data){
this.data=data;
}
@Override
public void onEvent(){
System.out.println(msg);
}
}
您可以使用它来注册它
register(new MyListenerImpl("Event occurs"));
每当eventHappens() 被调用(例如,如果你收到一个网络数据包,你可以调用它),你所有注册的监听器都会被执行。
例如:
register(new MyListenerImpl("listener 1 called"));
register(new MyListenerImpl("listener 2 called"));
System.out.println("calling event");
eventHappens();
会打印
通话事件
监听器 1 被调用
监听器 2 被调用
【讨论】:
MyListenerImpl 应该实现MyListener 接口
您似乎已经发现,Google 的第一个点击是 the EventListener documentation。
看到页面顶部的蓝色导航栏了吗?第四个词是“使用”链接。去那个。
EventListener 提供类型安全的多态性。例如,java.awt.Component 有一个 getListeners method,它需要 EventListener 的子类。
EventListener 实际上是该规范第 6.4 节中Java Beans specification. 的一部分:
由于新的 Java 事件模型基于方法调用,我们需要一种定义和分组事件处理方法的方法。我们要求在从 java.util.EventListener 继承的 EventListener 接口中定义事件处理方法。 按照惯例,这些 EventListener 接口的名称以结尾在“听众”中。
想要处理给定 EventListener 接口中定义的任何事件集的类应该实现该接口。
【讨论】: