【问题标题】:What is a java.util.EventListener? [duplicate]什么是 java.util.EventListener? [复制]
【发布时间】:2020-03-30 13:26:01
【问题描述】:

我找不到这个问题的答案。 什么是 java.util.EventListener?它是如何工作的? 我已经在google上做了一些研究,但是我只发现了这个,不是很清楚:所有事件监听器接口都必须扩展的标记接口。

有人可以帮忙吗?

【问题讨论】:

    标签: java event-listener


    【解决方案1】:

    侦听器是一个包含在某些操作发生时调用的方法的类。

    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 接口
    • 感谢您的指出。
    【解决方案2】:

    您似乎已经发现,Google 的第一个点击是 the EventListener documentation

    看到页面顶部的蓝色导航栏了吗?第四个词是“使用”链接。去那个。

    EventListener 提供类型安全的多态性。例如,java.awt.Component 有一个 getListeners method,它需要 EventListener 的子类。

    EventListener 实际上是该规范第 6.4 节中Java Beans specification. 的一部分:

    由于新的 Java 事件模型基于方法调用,我们需要一种定义和分组事件处理方法的方法。我们要求在从 java.util.EventListener 继承的 EventListener 接口中定义事件处理方法。 按照惯例,这些 EventListener 接口的名称以结尾在“听众”中。

    想要处理给定 EventListener 接口中定义的任何事件集的类应该实现该接口。

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 2020-05-24
      • 2011-07-07
      • 2011-10-24
      • 2021-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多