`
chxiaowu
  • 浏览: 240167 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java基础教程之事件和监听器

 
阅读更多

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

接口的设计

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

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

  1. package  listenerdemo.framework;  
  2.  
  3. /**  
  4.  * @author juntao.qiu  
  5.  */  
  6. public   interface  EventListener {  
  7.      /**  
  8.      * handle the event when it raise  
  9.      * @param event  
  10.      */  
  11.      public   void  handleEvent(EventSource event);  
  12. }  
  13.    

监听器接口,提供一个当事件发生后的处理方法即可:

  1. package  listenerdemo.framework;  
  2.  
  3. public   interface  EventSource {  
  4.      public   final   int  EVENT_TIMEOUT =  1 ;  
  5.      public   final   int  EVENT_OVERFLOW =  2 ;  
  6.  
  7.      /**  
  8.      * get an integer to identify a special event  
  9.      * @return  
  10.      */  
  11.      public   int  getEventType();  
  12. }  

实例化事件

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

  1. package  listenerdemo;  
  2.  
  3. import  listenerdemo.framework.*;  
  4.  
  5. public   class  TimeOutEvent  implements  EventSource{  
  6.      private   int  type;  
  7.  
  8.      public  TimeOutEvent(){  
  9.          this .type = EventSource.EVENT_TIMEOUT;;  
  10.     }  
  11.       
  12.      public   int  getEventType() {  
  13.          return   this .type;  
  14.     }  
  15.  
  16. }  

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

  1. package  listenerdemo;  
  2.  
  3. import  listenerdemo.framework.*;  
  4.  
  5. /**  
  6.  * @author juntao.qiu  
  7.  */  
  8. public   class  Timer  extends  Thread{  
  9.      private  EventListener listener;  
  10.      private   int  sleepSeconds;  
  11.  
  12.      public  Timer( int  seconds){  
  13.          this .sleepSeconds = seconds;  
  14.     }  
  15.  
  16.      public   void  setEventListener(EventListener listener){  
  17.          this .listener = listener;  
  18.     }  
  19.       
  20.      public   void  run(){  
  21.          for ( int  i = sleepSeconds;i> 0 ;i--){  
  22.              try  {  
  23.                 Thread.sleep( 1000 );  
  24.             }  catch  (InterruptedException ex) {  
  25.                 System.err.println(ex.getMessage());  
  26.             }  
  27.         }  
  28.           
  29.         raiseTimeoutEvent(); //raise一个TimeOut事件给监听器  
  30.     }  
  31.  
  32.      private   void  raiseTimeoutEvent(){  
  33.          this .listener.handleEvent( new  TimeOutEvent());  
  34.     }  
  35. }  

使用事件及其监听器

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

  1. package  listenerdemo;  
  2.  
  3. import  listenerdemo.framework.*;  
  4.  
  5. /**  
  6.  * @author juntao.qiu  
  7.  */  
  8. public   class  EventListenerTester  implements  EventListener{  
  9.      private   boolean  loop =  true ;  
  10.  
  11.      public   void  execute(){  
  12.         Timer timer =  new  Timer( 3 ); //初始化一个定时器  
  13.         timer.setEventListener( this ); //设置本类为监听器  
  14.         timer.start();  
  15.           
  16.          while (loop){  
  17.              try {  
  18.                 Thread.sleep( 1000 );  
  19.                 System.out.println( "still in while(true) loop" );  
  20.             } catch (Exception e){  
  21.                 System.err.println(e.getMessage());  
  22.             }  
  23.         }  
  24.  
  25.         System.out.println( "interupted by time out event" );  
  26.     }  
  27.  
  28.  
  29. //实现了EventListener接口  
  30.      public   void  handleEvent(EventSource event) {  
  31.          int  eType = event.getEventType();  
  32.          switch (eType){ //判断事件类型,我们可以有很多种的事件  
  33.              case  EventSource.EVENT_TIMEOUT:  
  34.                  this .loop =  false ;  
  35.                  break ;  
  36.              case  EventSource.EVENT_OVERFLOW:  
  37.                  break ;  
  38.              default :  
  39.                  this .loop =  true ;  
  40.                  break ;  
  41.         }  
  42.     }  
  43.  
  44.      public   static   void  main(String[] args){  
  45.         EventListenerTester tester =  new  EventListenerTester();  
  46.         tester.execute();  
  47.     }  
  48.  
  49. }  

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

分享到:
评论

相关推荐

    java的基础教程 基础教程

    总的来说,Java基础教程旨在帮助初学者理解Java编程的基本概念和语法,逐步建立起编写和调试Java程序的能力,为更高级的Java开发打下坚实的基础。通过深入学习和实践,开发者可以利用Java的强大功能来创建各种复杂的...

    java 事件处理教程 java窗口程序设计

    在Java中,事件处理采用授权事件模型,事件源(如按钮)将事件授权给一个或多个事件监听器(事件监视器)来处理。 "委派事件模型"是Java事件处理的核心。当事件发生时,事件源会生成一个特定类型的事件对象,然后将...

    Java 基础教程(初学者宝典)

    本教程“Java基础教程(初学者宝典)”旨在帮助初学者系统地理解和学习Java语言,提供了丰富的实例来加深理解。 首先,Java语言的基础部分包括语法结构、变量、数据类型和运算符。Java是一种强类型语言,这意味着在...

    Java语言基础教程-Java NIO流篇2

    这可能包括如何通过选择器(Selector)进行多路复用,即一个线程可以监听多个通道的事件,从而实现非阻塞I/O。选择器的使用大大提高了服务器处理大量并发连接的能力。 第6节将聚焦于Java NIO中的Socket通道操作,这...

    java swing基础教程

    本教程将深入讲解Java Swing的基础知识,帮助开发者掌握这一强大的工具。 1. **Swing组件基础** Swing提供了一系列组件,如按钮(JButton)、文本框(JTextField)、标签(JLabel)等,这些组件构成了用户界面的...

    java 基础教程PPT

    这份"Java基础教程PPT"提供了全面的学习资源,适合初学者掌握Java编程的核心概念。以下是根据提供的PPT章节内容展开的详细知识点讲解: 1. **第1章:Java和面向对象概述** - Java的历史和特点:了解Java的起源,其...

    JAVA视屏基础教程

    这可能是通过使用Java的AWT或Swing库来创建游戏界面,通过监听键盘和鼠标事件控制游戏对象的移动,以及用计时器实现游戏循环等。 在学习Java视频基础教程时,结合实际项目练习,如“跑跑卡丁车”,将有助于巩固理论...

    完整版 Java基础入门教程 Java程序语言设计 05 GUI AWT 事件模型(共27页).ppt

    在AWT事件体系结构中,还有许多其他类型的事件和对应的监听器,如`FocusEvent`(焦点事件),`KeyEvent`(键盘事件),`MouseEvent`(鼠标事件)等。每种事件都有特定的监听器接口,比如`FocusListener`用于处理组件...

    Java基础教程需要的请下载

    6. **常用组件及事件处理**:当涉及到图形用户界面(GUI)编程时,会介绍Swing组件和事件监听器。 7. **建立对话框**:如何创建和使用Java中的对话框,用于与用户交互。 8. **Java Applet基础**:Java小程序...

    java程序基础教程

    13. **Swing GUI编程**:基础的图形用户界面设计,如JFrame、JButton、JLabel等组件的使用,以及事件监听器的实现。 14. **JDBC数据库连接**:学习如何使用Java连接和操作数据库,包括加载驱动、建立连接、执行SQL...

    javaGUI基础教程

    本教程针对Java GUI设计的基础知识,适合初学者和对GUI设计有一定基础知识的开发者。 1. **AWT(Abstract Window Toolkit)组件简介** AWT是Java早期提供的GUI库,它依赖于本地操作系统来实现图形界面。`Frame`是...

    java 基础教程 培训速成!一周学会!

    ### Java基础教程培训知识点梳理 #### 一、Java概述与特点 - **Java的历史与现状**:Java由Sun Microsystems公司于1995年推出,是目前应用最为广泛的编程语言之一。 - **Java的特点**: - 面向对象:Java完全支持...

    java基础教程及代码

    本教程旨在为初学者提供全面的Java基础知识,帮助他们为参加Java认证考试做好充分准备。通过学习这个教程,你可以掌握Java的核心概念,从而在编程领域建立坚实的基础。 1. **Java简介**:Java是由Sun Microsystems...

    Java3D 教程 ch4

    此外,章节还涉及了交互的实现机制,包括事件监听器和行为类(Behaviors)。通过向组件添加事件监听器,可以捕捉用户的输入(如鼠标点击、键盘按键),并据此调整3D场景的状态。行为类则提供了一种更高级的交互方式...

    教你如何在java中自定义事件

    一、事件与事件监听器基础 在Java AWT和Swing库中,事件模型是基于观察者模式的。事件通常由一个对象(称为事件源)生成,然后被传递到感兴趣的其他对象(称为事件监听器)。例如,当用户点击按钮时,按钮对象会...

    Java EE基础实用教程[郑阿奇]

    此外,教程可能还会涵盖Web服务(如JAX-WS和JAX-RS)、过滤器(Filters)、监听器(Listeners)以及MVC设计模式等内容。通过学习这些知识,开发者能够具备构建复杂企业级应用的能力,为职业发展奠定坚实的基础。

    java 基础教程

    Java是一种广泛使用的面向对象的...总之,Java基础教程涵盖了语言基础、面向对象编程、数据库交互以及GUI开发等重要方面。通过深入学习和实践,你将能够熟练地运用Java来解决各种问题,为你的编程事业打下坚实的基础。

    Java基础之聊天器

    【Java基础之聊天器】是关于使用Java编程语言构建一个简单聊天器的教程。这个项目旨在帮助初学者理解网络通信的基础知识,特别是TCP/IP协议在Java中的应用。在这个教程中,我们将探讨以下关键知识点: 1. **Java ...

Global site tag (gtag.js) - Google Analytics