一文详解Java中的监听器(Listener)

 更新时间:2025年03月18日 08:28:49   作者:向前冲的小牛  
这篇文章主要介绍了Java中监听器(Listener)的相关资料,监听器模式是一种设计模式,用于处理异步事件和通知,文中通过代码介绍的非常详细,需要的朋友可以参考下

1,监听器模式的基本原理

监听器模式由以下几个部分组成:

  • 事件源(Event Source):产生事件的对象。
  • 事件对象(Event Object):封装了事件的详细信息。
  • 监听器接口(Listener Interface):定义了响应特定事件的方法。
  • 监听器实现(Listener Implementation):实现监听器接口,包含具体的事件处理逻辑。

监听器模式的步骤

  • 定义事件类:创建一个事件类,用于封装事件信息。
  • 定义监听器接口:创建一个接口,定义响应事件的方法。
  • 实现监听器接口:创建一个类,实现监听器接口,并在方法中编写事件处理逻辑。
  • 注册监听器:将监听器对象注册到事件源中,当事件发生时,事件源会通知监听器并调用相应的方法。

2,实际应用场景 

2.1  图形用户界面(GUI)事件处理

监听器模式广泛应用于图形用户界面(GUI)编程中,用于处理用户交互事件。

  • 按钮点击事件:当用户点击按钮时,触发相应的事件处理程序。
  • 鼠标事件:处理鼠标点击、移动、进入、退出等事件。
  • 键盘事件:处理键盘按下、释放等事件。
  • 窗口事件:处理窗口打开、关闭、最小化、最大化等事件。
JButton button = new JButton("Click Me");
button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Button clicked!");
    }
});

2.2 数据模型更新通知

监听器模式用于通知数据模型的变化,通常用于实现观察者模式。当数据发生变化时,所有注册的监听器都会被通知更新。

  • MVC 模式:在模型-视图-控制器(MVC)架构中,当模型数据发生变化时,视图需要更新以反映变化。
  • 数据绑定:在某些框架中,监听器用于实现数据绑定,当数据源变化时自动更新界面。
public class DataModel {
    private List<DataChangeListener> listeners = new ArrayList<>();

    public void addDataChangeListener(DataChangeListener listener) {
        listeners.add(listener);
    }

    public void removeDataChangeListener(DataChangeListener listener) {
        listeners.remove(listener);
    }

    public void notifyDataChange() {
        for (DataChangeListener listener : listeners) {
            listener.dataChanged();
        }
    }
}

public interface DataChangeListener {
    void dataChanged();
}

2.3  日志系统

日志系统可以使用监听器模式将日志信息发送到多个不同的目的地(例如控制台、文件、远程服务器等)。

  • 多重日志处理:一个日志事件可以被多个日志处理程序监听和处理,确保日志信息被保存到多个地方。
public class Logger {
    private List<LogListener> listeners = new ArrayList<>();

    public void addLogListener(LogListener listener) {
        listeners.add(listener);
    }

    public void removeLogListener(LogListener listener) {
        listeners.remove(listener);
    }

    public void log(String message) {
        for (LogListener listener : listeners) {
            listener.onLog(message);
        }
    }
}

public interface LogListener {
    void onLog(String message);
}

2.4 文件系统监控

监听器模式用于监控文件系统的变化,例如文件的创建、修改、删除等事件。 

  • 文件监控工具:某些工具可以监听特定目录的变化,当有文件变化时触发相应的处理。
Path path = Paths.get("/path/to/directory");
WatchService watchService = FileSystems.getDefault().newWatchService();
path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY);

while (true) {
    WatchKey key = watchService.take();
    for (WatchEvent<?> event : key.pollEvents()) {
        WatchEvent.Kind<?> kind = event.kind();
        Path fileName = (Path) event.context();
        System.out.println(kind + ": " + fileName);
    }
    key.reset();
}

2.5 网络和分布式系统

监听器模式用于处理网络和分布式系统中的异步事件,例如消息的到达、连接的建立或断开等。

  • 消息队列:监听器模式用于处理消息队列中的消息,当消息到达时触发相应的处理程序。
  • 网络连接:在网络编程中,监听器用于处理连接的建立、断开和数据接收等事件。
public interface MessageListener {
    void onMessage(String message);
}

public class MessageQueue {
    private List<MessageListener> listeners = new ArrayList<>();

    public void addMessageListener(MessageListener listener) {
        listeners.add(listener);
    }

    public void removeMessageListener(MessageListener listener) {
        listeners.remove(listener);
    }

    public void receiveMessage(String message) {
        for (MessageListener listener : listeners) {
            listener.onMessage(message);
        }
    }
}

2.6 任务调度和异步处理

监听器模式用于任务调度和异步处理,允许任务在完成后通知监听器进行后续处理。

  • 任务完成通知:当任务完成时,触发监听器执行相应的后续操作。
  • 异步事件处理:处理异步事件,当事件发生时通知监听器。
public interface TaskCompleteListener {
    void onTaskComplete();
}

public class Task {
    private List<TaskCompleteListener> listeners = new ArrayList<>();

    public void addTaskCompleteListener(TaskCompleteListener listener) {
        listeners.add(listener);
    }

    public void removeTaskCompleteListener(TaskCompleteListener listener) {
        listeners.remove(listener);
    }

    public void complete() {
        for (TaskCompleteListener listener : listeners) {
            listener.onTaskComplete();
        }
    }
}

3 自定义监听器

3.1 Java 中常见的监听器接口

  • ActionListener:用于处理动作事件,例如按钮点击。
  • MouseListener:用于处理鼠标事件,例如鼠标点击、进入、退出等。
  • KeyListener:用于处理键盘事件,例如按键按下、释放等。
  • WindowListener:用于处理窗口事件,例如窗口打开、关闭等。
  • FocusListener:用于处理组件焦点事件。

3,2 使用自定义监听器 

有时你可能需要定义自己的事件和监听器。以下是一个示例,展示如何创建和使用自定义监听器。

3,2,1 定义事件类

import java.util.EventObject;

public class CustomEvent extends EventObject {
    public CustomEvent(Object source) {
        super(source);
    }
}

3.2.2 定义监听器接口

import java.util.EventListener;

public interface CustomEventListener extends EventListener {
    void handleEvent(CustomEvent event);
}

3.2.3 实现事件源类

import java.util.ArrayList;
import java.util.List;

public class EventSource {
    private final List<CustomEventListener> listeners = new ArrayList<>();

    public void addCustomEventListener(CustomEventListener listener) {
        listeners.add(listener);
    }

    public void removeCustomEventListener(CustomEventListener listener) {
        listeners.remove(listener);
    }

    public void triggerEvent() {
        CustomEvent event = new CustomEvent(this);
        for (CustomEventListener listener : listeners) {
            listener.handleEvent(event);
        }
    }
}

3.2.4 使用自定义监听器

public class CustomEventListenerExample {
    public static void main(String[] args) {
        EventSource eventSource = new EventSource();

        // 添加自定义事件监听器
        eventSource.addCustomEventListener(new CustomEventListener() {
            @Override
            public void handleEvent(CustomEvent event) {
                System.out.println("Custom event triggered!");
            }
        });

        // 触发事件
        eventSource.triggerEvent();
    }
}

4 总结

监听器模式是一种强大的设计模式,适用于需要处理异步事件和通知的场景。通过使用监听器模式,可以实现松耦合的事件处理逻辑,提高代码的可维护性和扩展性。无论是在 GUI 编程、数据模型更新、日志系统、文件系统监控、网络编程还是任务调度中,监听器模式都提供了一种高效的事件处理机制。

到此这篇关于Java中监听器(Listener)的文章就介绍到这了,更多相关Java监听器Listener内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现字节数B转化为KB、MB、GB的方法示例【测试可用】

    Java实现字节数B转化为KB、MB、GB的方法示例【测试可用】

    这篇文章主要介绍了Java实现字节数B转化为KB、MB、GB的方法,结合实例形式分析了java字节数的转换运算相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • Android 资源 id详解及的动态获取

    Android 资源 id详解及的动态获取

    这篇文章主要介绍了Android 资源 id详解及的动态获取的相关资料,需要的朋友可以参考下
    2016-12-12
  • Java接入支付宝授权第三方登录的完整步骤

    Java接入支付宝授权第三方登录的完整步骤

    不管是支付宝支付,还是微信支付,还是银联支付等,大部分的支付流程都是相似的,这篇文章主要给大家介绍了关于Java接入支付宝授权第三方登录的相关资料,使用支付宝的沙盒环境示例,需要的朋友可以参考下
    2021-07-07
  • Java 将Excel转为SVG的方法

    Java 将Excel转为SVG的方法

    本文以Java示例展示如何将Excel文档转为SVG格式。通过本文中的方法,在将Excel转为SVG时,如果sheet工作表中手动设置了分页,则将每个分页的内容单独保存为一个svg文件,如果sheet工作表中没有设置分页,则将Excel sheet表格中默认的分页范围保存为svg。
    2021-05-05
  • Java包装类的缓存机制原理实例详解

    Java包装类的缓存机制原理实例详解

    这篇文章主要介绍了Java包装类的缓存机制原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Java基于字符流形式读写数据的两种实现方法示例

    Java基于字符流形式读写数据的两种实现方法示例

    这篇文章主要介绍了Java基于字符流形式读写数据的两种实现方法示,结合实例形式分析了java逐个字符读写及使用缓冲区进行读写操作的具体实现技巧,需要的朋友可以参考下
    2018-01-01
  • 浅谈Java中常用数据结构的实现类 Collection和Map

    浅谈Java中常用数据结构的实现类 Collection和Map

    下面小编就为大家带来一篇浅谈Java中常用数据结构的实现类 Collection和Map。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • eclipse连接不到genymotion问题的解决方案

    eclipse连接不到genymotion问题的解决方案

    今天小编就为大家分享一篇关于eclipse连接不到genymotion问题的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Mybatis原始执行方式Executor代码实例

    Mybatis原始执行方式Executor代码实例

    这篇文章主要介绍了Mybatis原始执行方式Executor代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • java selenium 常见web UI 元素操作及API使用

    java selenium 常见web UI 元素操作及API使用

    本文主要介绍java selenium 常见web UI 元素操作,这里帮大家整理了相关资料并附示例代码,有需要的小伙伴可以参考下
    2016-08-08

最新评论