当前位置: 首页 > news >正文

Java事件处理机制

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

1、事件角色

java中的事件机制的参与者有3种角色:

  1. event object:事件状态对象,用于listener的相应的方法之中,作为参数,一般存在与listerner的方法之中
  2. event source:具体的事件源,比如说,你点击一个button,那么button就是event source,要想使button对某些事件进行响应,你就需要注册特定的listener
  3. event listener:事件监听者。对每个明确的事件的发生,都相应地定义一个明确的Java方法。

2、Java 实现

主要的API:

  1. 事件状态类:java.util.EventObject
  2. 事件监听接口:java.util.EventListener

我们需要定义的类/接口有:

类名功能父类/父接口
事件状态类持有事件触发改变的“状态属性”EventObject
事件监听接口定义事件触发以后,根据不同状态属性的抽象操作方法EventListener
具体的监听实现类(可以有多个)提供具体的,根据不同状态属性的操作事件监听接口
事件源类

1、持有监听类,并提供注册功能

2、提供触发事件的功能,触发事件的同时,通知监听器

 

示例如下:

  • 事件状态类:
/**
 * Created by 兴趣使然的程序员 on 2017/7/12.
 * 事件状态类
 * 持有事件触发改变的“状态属性”
 */
public class EventState extends EventObject {

    private String state;

    public void setDoorState(String state) {
        this.state = state;
    }

    public String getDoorState() {
        return this.state;
    }

    /**
     * Constructs a prototypical Event.
     *
     * @param source The object on which the Event initially occurred.
     * @throws IllegalArgumentException if source is null.
     */
    public EventState(Object source) {
        super(source);
    }
}
  • 事件监听接口:
/**
 * Created by 兴趣使然的程序员 on 2017/7/12.
 * 事件监听接口
 */
public interface StateListener extends EventListener {
    void doorEvent(EventState event);
}
  • 事件源类:
/**
 * Created by 兴趣使然的程序员 on 2017/7/12.
 * 具体的事件源类
 *
 */
public class EventSource {
    private ConcurrentLinkedQueue<StateListener> listeners;

    /**
     * 添加监听
     */
    public void addListener(StateListener stateListener) {
        if (listeners == null) {
            listeners = new ConcurrentLinkedQueue();
        }
        listeners.add(stateListener);
    }

    /**
     * 移除监听
     */
    public void removeListener(StateListener stateListener) {
        if (listeners == null)
            return;
        listeners.remove(stateListener);
    }

    /**
     * 触发事件,更改事件状态
     */
    protected void fireStateChange(String doorState) {
        if (listeners == null)
            return;
        EventState event = new EventState(this);
        event.setDoorState(doorState);
        notifyListeners(event);
    }

    /**
     * 通知所有的DoorListener,让Listener对状态变化做出响应操作
     */
    private void notifyListeners(EventState event) {
        for(StateListener stateListener:listeners)
            stateListener.doSomethingForEvent(event);
    }
}
  • 使用:
/**
 * Created by 兴趣使然的程序员 on 2017/7/12.
 */
public class Test {
    public static void main(String[] args) {
        EventSource eventSource = new EventSource();
        //添加一个监听,并同时定义根据事件状态变化做出的操作
        eventSource.addListener(new ListenerA());
        eventSource.fireStateChange("啦啦啦");
    }
}

class ListenerA implements StateListener{
    @Override
    public void doSomethingForEvent(EventState event) {
        String doorState = event.getDoorState();
        System.out.println(doorState);
        //触发事件以后,将自己移除
        ((EventSource)event.getSource()).removeListener(this);
    }
}

 

转载于:https://my.oschina.net/pierrecai/blog/1353322

相关文章:

  • python__系统 : socket_UDP相关
  • 字符编码
  • 2017-07-14 数组学习 插入数字按顺序输出
  • python 基础总结复习
  • 网络相关以及防火墙
  • linux 优化
  • [Pyhton]weakref 弱引用
  • python之线程和进程(并发编程)
  • Linux系统小技巧(3):sar、last和dmesg的时间戳选项
  • Hibernate-ORM:07.Hibernate中的参数绑定
  • 老男孩教育每日一题-第96天-网站并发知识点:pv-并发与架构设计基础知识
  • Notepad++ 添加MarkdownViewerPlusPlus插件
  • ORACLE查询树型关系start with connect by prior
  • CentOS7安装Python3
  • 漂亮的css
  • [deviceone开发]-do_Webview的基本示例
  • 345-反转字符串中的元音字母
  • 77. Combinations
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • CSS 提示工具(Tooltip)
  • Druid 在有赞的实践
  • happypack两次报错的问题
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Linux后台研发超实用命令总结
  • python学习笔记 - ThreadLocal
  • SpiderData 2019年2月13日 DApp数据排行榜
  • SQLServer之索引简介
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 多线程 start 和 run 方法到底有什么区别?
  • 模型微调
  • 前嗅ForeSpider中数据浏览界面介绍
  • 一道闭包题引发的思考
  • 用jquery写贪吃蛇
  • elasticsearch-head插件安装
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 昨天1024程序员节,我故意写了个死循环~
  • ​flutter 代码混淆
  • ​TypeScript都不会用,也敢说会前端?
  • #if #elif #endif
  • (+4)2.2UML建模图
  • (2022 CVPR) Unbiased Teacher v2
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (rabbitmq的高级特性)消息可靠性
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (九)One-Wire总线-DS18B20
  • (七)理解angular中的module和injector,即依赖注入
  • (全注解开发)学习Spring-MVC的第三天
  • (四)JPA - JQPL 实现增删改查
  • (四)鸿鹄云架构一服务注册中心
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • .net core Swagger 过滤部分Api
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 读取 JSON格式的数据
  • .Net多线程总结