一文带你学会Java事件机制
作者:北鱼扶摇 发布时间:2022-07-22 05:05:11
相信做 Java 开发的朋友,大多都是学习过或至少了解过 Java GUI 编程的,其中有大量的事件和控件的绑定,当我们需要在点击某个按钮实现某些操作的时候,其实就是为这个按钮控件注册了一个合理处理点击事件的 * 。此外,Spring Framework 中也有许多用到事件处理机制的地方,如 ApplicationContextEvent 及其子类,代表着容器的启动、停止、关闭、刷新等事件。本文会为大家介绍 Java 的事件处理机制,也会用示例来说明,如何优雅地触发并处理一个自定义事件。
委托事件模型
Java 自 1.1 之后基于委托事件模型,定义了标准一致的获取和处理事件的方式。它的思路非常简单,由事件源发起特定事件,并将事件发送给一个或多个事件 * ,而 * 在此过程中一直处于等待状态,直到接收到该事件,然后处理事件并返回。实现起来也很简单:
定义事件
实现特定的 * 接口,接收特定类型的事件
实现代码,注册(或解除) * 作为特定事件类型的接收者
在恰当的时机触发事件
核心组件
在 Java 的这个事件处理机制中,包含三个核心组件:
事件 事件对象,描述相位的变化。比如在 GUI 中一个动作的点击,在 Spring Framework 中容器的启停,更多的诸如电脑的开机、关机、休眠,缓存的过期,公众号的关注、取关等等。
事件源 可以是任意对象,它具备触发事件的能力。一般在这个对象中注册(或解除) * ,此外事件的触发通常也在这里。一个源可能产生多个不同类的事件,要为不同的事件类型分别注册事件 * ,而每个事件类型可以注册一个或多个 * 。
事件 * 一个实现了特定接口的类,它需要实现对针对特定事件的具体处理方法,且必须被注册到该特定事件上。
那么问题来了,我们如何优雅地触发并处理一个自定义事件呢?
自定义事件
在 Java 中自定义事件非常简单。考虑到现在各个应用中都有绑定社交账号的需求,我们就以此为例,在社交账号绑定或者解绑时简单的打印一条记录。
首先定义一个事件对象,代码如下:
public class SocialEvent extends EventObject {
private static final long serialVersionUID = -5473622737706032666L;
public static final int WECHAT_BIND = 1;
public static final int WECHAT_UNBIND = 2;
public static final int WEIBO_BIND = 3;
public static final int WEIBO_UNBIND = 4;
private int socialType;
public SocialEvent(Object source, int socialType) {
super(source);
this.socialType = socialType;
}
public int getSocialType() {
return socialType;
}
public void setSocialType(int socialType) {
this.socialType = socialType;
}
}
事件类必须是 EventObject
的子类。值得一提的是,事件对象通常代表一类而非一个事件,即合理的做法是将一类事件而非一个事件概念融合起来。
接下来,我们实现一套事件处理逻辑,即事件 * :
public class SocialEventListener implements EventListener {
public void onSocialChanged(SocialEvent event) {
switch (event.getSocialType()) {
case SocialEvent.WECHAT_BIND:
System.out.println("Wechat bind.");
break;
case SocialEvent.WECHAT_UNBIND:
System.out.println("Wechat unbind.");
break;
case SocialEvent.WEIBO_BIND:
System.out.println("Weibo bind.");
break;
case SocialEvent.WEIBO_UNBIND:
System.out.println("Weibo unbind.");
break;
default:
System.out.println("Bad social type.");
break;
}
}
}
此外,我们需要一个事件源:
public class Social {
private List<SocialEventListener> listeners;
public void addListener(SocialEventListener listener) {
if (listeners == null) {
listeners = new ArrayList<>();
}
listeners.add(listener);
}
public void removeListener(SocialEventListener listener) {
if (listeners != null) {
listeners.remove(listener);
}
}
public void emitEvent(SocialEvent event) {
for (SocialEventListener listener : listeners) {
listener.onSocialChanged(event);
}
}
public List<SocialEventListener> getListeners() {
return listeners;
}
public void setListeners(List<SocialEventListener> listeners) {
this.listeners = listeners;
}
}
在这里,我们定义了专门的类 Social 作为事件源,事实上,可以在任意其他的类中实现事件的触发与注册逻辑,比如启动类中。
顺便说一句,我们在 Java GUI 编程中,通常只需要为组件注册事件 * ,而无需考虑事件的触发逻辑,这是因为它们的事件是由系统自动触发的。
来源:https://www.cnblogs.com/xxcbdhxx/p/15403567.html


猜你喜欢
- 这个问题百度上一搜一大把,基本上都是说找到和SurfaceView的比例相近的camera预览尺寸,但是发现预览时候还是差了点意思,具体看下
- 把三状态转换图放在这,方便分析方法的作用:1.Session的save()方法Session是Hibernate所有接口中最重要的接口,提供
- 本文实例讲述了C#多线程学习之生产者和消费者用法。分享给大家供大家参考。具体实分析如下:前面的文章说过,每个线程都有自己的资源,但是代码区是
- 本文为大家分享了maven环境变量配置的具体方法,供大家参考,具体内容如下一、maven环境配置1.解压apache-maven
- Android的遮罩效果就是把一张图片盖在另一张图片的上面,通过控制任意一张图片的显示百分比实现遮罩效果。下面我使用两张一样的图片来实现一个
- 引言之前关于事务的文章已介绍了事务的概念以及事务的四个属性(ACID),相信你对事务应该有所认识和了解。本篇文章是关于事务的隔离性,介绍数据
- 企业级的系统和我们平常桌面、手机上运行的软件有着很重要的区别,其中比较重要的一点就是环境(包括第三方的系统的不同接口以及各系统的不同版本、安
- 当使用struts2的validation.xml进行验证时,需要注意如下几个方面:I.首先应该注意validation.xml的名字,一定
- 这几天一直都在捣鼓android的知识点,兴趣班的老师,讲课太过深奥,天(想到什么就见什么,后后面完全不想听),最后自己找资料总结了在And
- 本文实例讲述了C#不重复输出一个数组中所有元素的方法。分享给大家供大家参考。具体如下:1.算法描述0)输入合法性校验1)建立临时数组:与原数
- 概念JavaBean在实际编程中,我们常常需要一些用来包装值对象的类,例如Student、 Employee、Order,这些 类中往往没有
- 本文实例讲述了Java接口的简单定义与实现方法。分享给大家供大家参考,具体如下:1、接口是Java中最终要的概念,接口可以理解为一种特殊的类
- 背景今天学习Springboot,但是用的apache-maven 3.0 ,导入springboot1.5.19 ,Maven项目老是爆红
- 1. 新建TestServlet类package com.yanek.test;import java.io.IOException;imp
- 一、Flutter代码的启动起点我们在多数的业务场景下,使用的都是FlutterActivity、FlutterFragment。在在背后,
- 下载IDEA插件IDEA插件选择版本号下载与IDEA版本号相近的插件打开IDEA,导入下载好的插件在File下找到setting在Plugi
- https://www.jb51.net/article/152879.htm上节,我们明白了proc文件系统的作用,接下来我们在已经写好的
- 一.安装在 IDEA(2019)的 setting 的 Plugins 的 Marketplace 中搜索 leetcode,即可以找到该插
- 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。工
- 原本计划这一篇来总结JSP,由于JSP的内容比较多,又想着晚上跑跑步减减肥,所以今天先介绍Filter以及它的使用举例,这样的话还有些时间可