文档章节

Java事件处理机制

兴趣使然的程序员
 兴趣使然的程序员
发布于 2017/07/12 10:05
字数 640
阅读 68
收藏 0

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);
    }
}

 

© 著作权归作者所有

兴趣使然的程序员
粉丝 23
博文 112
码字总数 87412
作品 0
深圳
程序员
私信 提问

暂无文章

32位与64位Linux系统下各类型长度对比

64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。 1. 32 位和 64 位C数据类型...

mskk
28分钟前
6
0
Vue 实现点击空白处隐藏某节点(三种方式:指令、普通、遮罩)

在项目中往往会有这样的需求: 弹出框(或Popover)在 show 后,点击空白处可以将其 hide。 针对此需求,整理了三种实现方式,大家按实际情况选择。 当然,我们做项目肯定会用到 UI 框架,常...

张兴华ZHero
34分钟前
7
0
SpringBoot激活profiles你知道几种方式?

多环境是最常见的配置隔离方式之一,可以根据不同的运行环境提供不同的配置信息来应对不同的业务场景,在SpringBoot内支持了多种配置隔离的方式,可以激活单个或者多个配置文件。 激活Profi...

恒宇少年
36分钟前
8
0
PDF修改文字的方法有哪些?怎么修改PDF文件中的文字

PDF修改文字一直以来都是一个难以解决的问题,很多的办公族在办公的时候会有修改PDF文件中的文字的需要,可是PDF文件一般是不能进行编辑和修改的,难道就没有什么办法解决这个问题了嘛?不要...

趣味办公社
39分钟前
5
0
企业组织中采用服务网格的挑战

作者:Christian Posta 译者:罗广明 原文:https://blog.christianposta.com/challenges-of-adopting-service-mesh-in-enterprise-organizations/ 编者按 本文作者介绍了企业组织采用服务网...

jimmysong
49分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部