java事件监听机制及应用

25 篇文章 0 订阅

java的事件监听机制作用:为节省资源系统不对某个事件进行实时监听,故需要当某事件发生时(并进行事件发布)处理代码被自动运行,类似钩子一般(回调函数)

当事件源对象发生了某一事件后,事件信息将被打包为ActionEvent类,并发送给事件监听器。而后事件监听器将根据其内容(包括鼠标点击的位置,动作等)做出相应的处理。(自动执行actionPerformed()函数)
而实现了特定接口的事件监听器为了对事件源对象的某一特定事件进行监测必须进行注册。即告知事件源对象已被监听(b.addActionListener(m)

java的事件处理机制概览

根据事件处理机制的总体情况,Java从总体上采用了四个对象(类)来完成对事件的处理。

事件源类:描述事件发生源的基本属性和行为。比如,按钮是很多事件发生的事件源,Java构造按钮类来描述按钮的形状,颜色等等属性以及在屏幕上绘制按钮等动作,当然也包括按钮按下等相关事件发生本身。同时,在事件发生时,事件源类还负责发出事件发生的通知。该行为通过事件源查找自己的事件监听者队列,并将事件信息通知队列中的监听者来文成。同时,事件源还在得到有关监听者信息时负责维护自己的监听者队列。

事件类:描述某个事件的所有属性和相关动作。比如定义键盘事件类KeyEvent来描述键盘事件的所有信息,如键是否按下、是否释放、是否双击,以及相关键的信息,如键码,是否有组合键等等。

事件监听者类,也就是关注事件的主体类:当事件发生后,该主体负责进行相关的事件处理,同时,它还负责通知相关的事件源,自己关注它的特定的事件,以便事件源在事件发生时能够通知该主体。

事件监听者接口:事件发生后,事件源要将相关的信息通知对应的监听者。这要求必须在事件源和监听者之间定义一个标准的接口规范,以便完成这样的信息交换。监听者接口正是负责定义这样的接口规范。

这四种类的实现有以下一些比较关键的地方。

事件源的监听者队列的维护。通常可以通过定义一个可以接受任何对象的队列来完成。因此,事件源应该至少做这么三件事:定义队列,通常通过定义一个Vector实例来接收和存储Object类型的监听者;定义添加监听者的方法,通常通过定义由监听者调用的addXXXListener方法完成向Vector队列中添加监听者;定义删除监听者的方法,通常通过定义由监听者调用的removeXXXListener方法来删除Vector队列中记录的监听者。

事件源事件的通知。在事件源发生某个事件后,事件源构造相应的事件类的实例,并在监听者队列中查找所有记录的监听者,并调用监听者对应的事件处理函数从而达到通知监听者的目的。这里,为了顺利地完成这种通知和调用,必须事先约定好这个处理函数接口。这种约定是由监听者接口来进行的。即在监听者接口中申明这些接口函数的名称和参数,而由监听者应用这些接口,并实现接口中的接口函数来完成。所以,接口函数实际上也就是监听者的对应事件的处理函数,在事件发生后监听者需要进行的操作都应该在这个函数中实现。同时,为了获得事件的信息,通常这样的接口函数都会传递对应的事件类参数。当然,也可以在接口中定义其它需要传递的参数。事件源构造对应的事件实例,并调用接口程序完成参数传递和事件通知。因此,在事件源中,需要编写相应的代码来完成事件队列的查询和接口函数的调用。

在Java中,由于应用接口必须在应用的类中实现接口中的所有申明函数,有时对于不需要使用所有申明函数的监听者比较麻烦,所以通常可以编写一个基础的适配器类来应用接口,适配器中预先实现所有的空接口函数,监听者则通过继承适配器并重载自己需要的接口函数来避免直接应用接口的麻烦。

在Java的类库中,提供了大多数常用的事件源、事件类、接口类及适配器类,因此实际使用中,只要在主体也就是监听者中应用接口或适配器,并实现相应的事件处理函数,然后利用addXXXListener添加相应的事件源的监听器,就完成事件机制的使用了。

当然,如果编制了自己的新事件源类,并且需要实现在Java类库中没有预先实现的事件,则还需要编制自己的事件类(通常派生自EventObject),编制相应的事件接口类(通常派生自EventListener)并预定义相应的接口函数,在事件源类中实现相应的addXXXListener方法和removeXXXListener方法,并完成对监听者队列的管理和事件通知代码的编写。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值