`
abruzzi
  • 浏览: 452753 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

事件和监听器

阅读更多

前言

事件监听器是经常可以遇到的一种设计模式,一般用在这样一种场景下:当模块的一部分A在完成后需要通知其他的软件模块B,而等待通知的模块B在事先不需要采用轮询的方式来查看另一个模块A是否通知自己。即,当某事件发生,则监听器立刻就知道了该事件。这种模式大量的应用在GUI设计中,比如按钮的点击,状态栏上状态的改变等等。

接口的设计

我们需要一个对事件(event)的抽象,同样需要一个对监听器(listener)的抽象。我们可以把接口抽的很简单:

这个是事件源的接口,只需要提供一个可以获取事件类型的方法即可:

package listenerdemo.framework;

public interface EventSource {
    
public final int EVENT_TIMEOUT = 1;
    
public final int EVENT_OVERFLOW = 2;

    
/**
     * get an integer to identify a special event
     * 
@return
     
*/
    
public int getEventType();
}
 
监听器接口,提供一个当事件发生后的处理方法即可:
package listenerdemo.framework;

/**
 * 
@author juntao.qiu
 
*/
public interface EventListener {
    
/**
     * handle the event when it raise
     * 
@param event
     
*/
    
public void handleEvent(EventSource event);
}
 

事件和监听器框架类图

实例化事件

我们举一个实现了事件源接口(EventSource)的类TimeoutEvent 来说明如何使用事件监听器模型:

 

package listenerdemo;

import listenerdemo.framework.*;

public class TimeOutEvent implements EventSource{
    
private int type;

    
public TimeOutEvent(){
        
this.type = EventSource.EVENT_TIMEOUT;;
    }
    
    
public int getEventType() {
        
return this.type;
    }

}
这个事件的类型为EVENT_TIMEOUT, 当操作超时时触发该事件,我们假设这样一个场景:一个定时器T, 先设置这个定时器的时间为t,当t到时后,则触发一个超时事件,当然,事件是需要监听器来监听才有意义的。我们看看这个定时器的实现:
package listenerdemo;

import listenerdemo.framework.*;

/**
 * 
@author juntao.qiu
 
*/
public class Timer extends Thread{
    
private EventListener listener;
    
private int sleepSeconds;

    
public Timer(int seconds){
        
this.sleepSeconds = seconds;
    }

    
public void setEventListener(EventListener listener){
        
this.listener = listener;
    }
    
    
public void run(){
        
for(int i = sleepSeconds;i>0;i--){
            
try {
                Thread.sleep(
1000);
            } 
catch (InterruptedException ex) {
                System.err.println(ex.getMessage());
            }
        }
        
        raiseTimeoutEvent();//raise一个TimeOut事件给监听器
    }

    
private void raiseTimeoutEvent(){
        
this.listener.handleEvent(new TimeOutEvent());
    }
}

使用事件及其监听器

在类Tester的execute()方法中,我们先设置一个定时器,这个定时器初始化为3秒,设置好定时器后,程序进入一个while(true)循环中,当定时器到时后,它会发送一个timeout事件给当前线程Tester,此时我们可以设置execute中的while条件为false,退出死循环。流程很清晰了,我们来看看代码:

 

package listenerdemo;

import listenerdemo.framework.*;

/**
 * 
@author juntao.qiu
 
*/
public class EventListenerTester implements EventListener{
    
private boolean loop = true;

    
public void execute(){
        Timer timer 
= new Timer(3);//初始化一个定时器
        timer.setEventListener(
this);//设置本类为监听器
        timer.start();
        
        
while(loop){
            
try{
                Thread.sleep(
1000);
                System.out.println(
"still in while(true) loop");
            }
catch(Exception e){
                System.err.println(e.getMessage());
            }
        }

        System.out.println(
"interupted by time out event");
    }


//实现了EventListener接口
    
public void handleEvent(EventSource event) {
        
int eType = event.getEventType();
        
switch(eType){//判断事件类型,我们可以有很多种的事件
            
case EventSource.EVENT_TIMEOUT:
                
this.loop = false;
                
break;
            
case EventSource.EVENT_OVERFLOW:
                
break;
            
default:
                
this.loop = true;
                
break;
        }
    }

    
public static void main(String[] args){
        EventListenerTester tester 
= new EventListenerTester();
        tester.execute();
    }

}

运行结果如下:
run:
still in 
while(true) loop
still in 
while(true) loop
still in 
while(true) loop
interupted by time out event
程序正是按照预期的方式运行了,当然,为了说明主要问题,我们的事件,对事件的处理,监听器的接口都尽可能的保持简单。如果想要完成更复杂的功能,可以参考文章中的方法自行扩充,但是大概流程文中都已经说到。
分享到:
评论

相关推荐

    Java Swing 常用事件和监听器接口

    Java Swing 常用事件和监听器接口 Java Swing 是一个功能强大的图形用户界面(GUI)工具包,它提供了许多事件和监听器接口,帮助开发者更好地处理用户交互。下面是 Java Swing 中常用的事件和监听器接口。 1. ...

    java AWT常用事件和监听器接口方法

    在AWT中,事件处理是通过事件监听器接口来实现的,这些接口定义了特定类型的事件发生时需要调用的方法。下面我们将详细探讨Java AWT中的常见事件、监听器接口及其方法。 1. **ActionEvent** 和 **ActionListener**...

    事件处理监听器

    这些动作会触发程序中的特定行为,通常通过事件监听器来实现。本文将深入探讨事件处理监听器的概念,以及如何在Java或类似的面向对象语言中设置和使用它们。 首先,我们来理解“事件”这个概念。在UI编程中,事件是...

    基于Android平台下Button控件单击事件和监听器的五种编写.pdf

    基于Android平台下Button控件单击事件和监听器的五种编写.pdf

    JAVA事件监听器的四种实现方式

    事件监听器的实现方式有多种,本篇文章将介绍四种常见的事件监听器实现方式:自身类作为事件监听器、外部类作为事件监听器、匿名内部类作为事件监听器和内部类作为事件监听器。 1. 自身类作为事件监听器 在这个...

    java事件和监听的区别

    ### Java事件和监听的区别 在Java编程语言中,事件(Event)与监听器(Listener)是构建用户交互界面的关键组成部分。...理解和掌握事件与监听器的概念及其工作原理,对于开发高质量的Java应用程序来说至关重要。

    Spring的ApplicationEvent事件和监听器的测试Demo

    接下来,你需要一个事件监听器来响应这些事件。在Spring中,这可以通过实现`ApplicationListener`接口来完成。监听器将接收到`ApplicationEvent`的实例,并在其`onApplicationEvent`方法中处理事件。 ```java @...

    自定义事件的监听器

    2. 对某个源注册一个监听器,此源便成为一个事件源,当事件源上发生某一个动作时,监听器的某个方法将会被调用执行,在执行事件监听器的这个方法时,同时会把事件监听对象传递给此方法,开发人员在监听器中可以拿到...

    android 外部类作为事件监听器类

    在Android开发中,事件监听器(Event Listeners)是实现用户交互和响应各种事件的关键机制。标题提到的“android 外部类作为事件监听器类”是指将一个非匿名类(外部类)作为事件处理的对象,这在某些情况下可能是...

    监听器.zip

    开发者可以根据需求创建自己的事件和监听器,通过发布和订阅机制实现特定的事件通知。 9. **listener_demo、listener_demo1、listener_demo2**: 这三个示例项目很可能是逐步进阶的,可能从基本的动作监听开始,...

    java监听器的实现和原理详解

    Java监听器的实现可以分为三个部分:事件源、事件对象和事件监听器。事件源是指产生事件的对象,例如按钮、文本框等。事件对象是指事件的载体,用于传递事件信息。事件监听器是指负责处理事件的对象,例如点击按钮时...

    Java设计模式之监听器模式实例详解

    当事件源(熊孩子)发生某个事件(洗手前的行为)时,就会创建事件对象(RemindWashingHandsEvent),随后触发事件监听器(RemindListener)的响应(提醒操作)。 更具体的实现可以参考Kid类和WashingHandsListener...

    servlet事件监听器和JSP基础

    Servlet事件监听器允许开发者对特定的Servlet容器事件做出反应,而JSP则是用于创建动态网页的简便方式。这里我们将深入探讨这两个概念以及它们在实际应用中的使用。 一、Servlet事件监听器 Servlet事件监听器是...

    android全局事件监听器

    在Android开发中,全局事件监听器是一种非常实用的设计模式,它允许开发者在整个应用程序范围内监听特定的事件,而无需在每个需要响应的类中都添加监听代码。标题中的"android全局事件监听器"指的是一个实现此类功能...

    java事件监听器

    当你将一个类用作事件监听器时,你已经设置好一个特定的事件类型,它会用该类进行监听。接下来的操作是:一个匹配的监听器必须被加入到该组件中 组件被创建之后,可以在组件上调用如下方法来将监听器与它联系起来 ...

    Qt全局鼠标、键盘事件监听器库

    【Qt全局鼠标、键盘事件监听器库】是一个用于在Windows和Linux系统上实现跨平台的全局鼠标和键盘事件捕获的库。这个库基于流行的Qt框架,为开发者提供了一个便捷的方式来监听并处理系统的输入事件,无论是来自应用...

    Passive Event Listeners - 被动事件监听器1

    例如,针对鼠标滚轮和触摸事件,我们可以这样添加被动事件监听器: ```javascript document.addEventListener("mousewheel", fn, {passive: true}); ``` 但是,需要注意的是,并非所有浏览器都支持这个特性。因此...

    Java事件处理机制- 事件监听器的四种实现方式

    本文将详细解析Java事件处理机制中事件监听器的四种实现方式:自身类作为事件监听器、外部类作为事件监听器、匿名内部类作为事件监听器以及内部类作为事件监听器。 1. **自身类作为事件监听器** 在自身类作为事件...

    事件监听器-EditText的事件监听

    事件监听器是Android开发中的重要概念,用于捕捉和响应用户在界面上的各种交互操作。在Android中,事件监听器主要用于处理UI控件的点击、触摸、键盘输入等事件。本篇将详细介绍EditText的事件监听。 首先,我们来看...

    windchill交流第三篇:Windchill中的事件监听

    工具方面,Windchill提供了一套完整的开发环境,如Windchill ProjectLink和Windchill Workgroup Manager,它们支持事件监听器的创建、部署和测试。此外,IDE如Eclipse,配合Windchill插件,可以方便地进行源代码的...

Global site tag (gtag.js) - Google Analytics