Java中的事件监听器和处理程序有什么区别?


81

用Java的一般术语来说,有事件的侦听器和处理程序。
我的意思是我不知不觉地使用它们,无论API中有哪些可用。

我的问题是,在什么情况下我们使用侦听器,在什么情况下我们使用事件的处理程序?

它们之间有什么区别?特性??

我已经搜索了原因,但找不到Java的正确解释。


这篇博客文章有一个不错的摘要。lemnik.wordpress.com/2009/03/04/...
kevinarpe

Answers:


62

侦听器和处理程序之间没有正式定义的区别。有人可能会争辩说它们是可互换的。但是对我来说,它们的含义略有不同。

侦听器是一个对象,用于订阅源中的事件。cf. 在观察者模式。通常,您可以为每种类型的事件指定许多侦听器,并且它们是通过方法添加的addXyzListener

例如:MouseListener在Java的API中。

处理程序是负责处理某些事件的对象。典型的方案是为特定事件/任务提供处理程序,以作为构造函数的参数,或者通过方法设置处理程序setXyzHandler。换句话说,对于每种类型的事件,通常都有一个处理程序。

例如:MemoryHandler在Java的API中。


您好,谢谢您的回答。“活动订阅”是什么意思?“听众”是什么意思?
BKSpurgeon '16

@BKSpurgeon,请参阅答案中链接的关于观察者模式的维基百科文章。
aioobe '16

32

最基本的区别是联想

  • 侦听器与事件源关联(例如:键盘)
  • 处理程序与事件关联(例如:keydown)

一般而言,只有一个中央处理程序管理器来管理所有事件,而对于侦听器而言,每个要侦听的实体都必须管理自己的侦听器集合


鼠标是事件源,如果将类比MouseListener与事件源关联,则为Mouse
Swapnil 2015年

23

这是我的看法:

一个监听的事件手表被解雇。例如,一个KeyListener等待KeyEvents,一个MessageListener等待消息到达队列,等等。

处理器是负责处理该事件。通常,侦听器和处理程序是并行的。例如,KeyListener告诉ExitHandler“字母Q被按下”,并且该处理程序执行诸如清理资源和正常退出应用程序之类的逻辑。类似地,ButtonClickListener会告诉同一ExitHandler“单击了退出按钮”。因此,在这种情况下,您有两个不同的事件,两个不同的侦听器,但只有一个处理程序。


5

侦听器是在事件发生时得到通知的对象,它有2个主要要求-1必须已向一个或多个源注册以接收有关特定事件类型的通知2-它必须实现接收和处理方法这些通知。处理程序负责处理事件。


4

侦听器侦听事件,这些事件是描述事件的数据值对象。事件发生的时间和事件的顺序通常很重要。按下键“ 0”后跟“ 1”不同于“ 1”和“ 0”。

处理程序处理复杂的对象,例如新的Socket连接。处理程序可以在任何时间长度内处理对象。对象创建和排序的时间并不那么重要。来自client0或client1的连接可以按任何顺序进行。


4

我认为差异是细微的,因为具体的侦听器也是事件处理程序,或者至少具有可以视为事件处理程序的方法。也就是说,一个具体的侦听器在接收到一个事件对象(来自事件源)后,将处理或管理对该事件的反应,该事件对象包含有关刚刚发生的事件的所有有用信息(在事件源上)。由于此侦听器必须实现xxxListener接口,该接口强制他实施至少一种方法,该方法在事件发生时由事件源对象依次执行,因此可以将侦听器本身视为处理程序,更确切地说,可以将其视为方法。可以将由Listener对象实现的Listener接口视为真正的事件处理程序。因此,我将事件处理程序视为只是响应事件而执行的代码。这与侦听器对象不同,侦听器对象是更抽象的概念(例如观察者设计模式)的元素。这是我对此主题的个人看法。


4

在我看来,最重要的区别在于事实是,我们针对每个事件的源使用侦听器,而不是针对事件类型的处理程序。


2

从概念上讲,它们是同一件事-一个对象,它响应UI事件执行一些操作。通常,在Swing中,这些对象在外观级别被称为“处理程序”(用于处理低级窗口小部件事件),在更抽象的UI级别被称为“侦听器”(您将在其中实现应用程序逻辑) )。


0

JavaFX中为所有UI控件引入了EventHandler。侦听器是借用Observable的,例如属性。

EventHandler是区分可观察事件和ui事件的一种方式。


0

我一直在试图弄清所有信息,但我迷路了。我看过Delphi(Pascal),C,C ++,java ...还不清楚。所以,一个月后,这就是我所看到的问题。我可能完全偏离了轨道,所以请有礼貌地告诉我。

一个事件发送者,一个捕获器,只要发件人注册了该捕获器。我有4个对话框,每次文件(其处理代码不在4个对话框中的另一个模块中)更改时都需要更新。我考虑过用老式的方式进行更新,但是后来我研究了Delphi事件和消息处理。让我们来看看:

文件F(发送方)已完成阅读,应将现在有数据显示给用户和他们玩的事实通知对话框1..4。什么是最好的?

尝试将对话框1..4注册为侦听器,并让发送方以某种方式触发OnUpdatedDataEvent吗?

尝试在系统上发送消息,希望Dialogs 1..4能够捕获到它?

请注意,该事件使事物保持耦合,而消息传递却没有……并且调试起来很痛苦。

我不知道File的代码块将如何注册4个侦听器(对话框)?

我正在研究级联调用的可能性,这意味着调用方调用一个监听器,然后调用下一个监听器,直到到达链的末尾。我什至不知道那是否有可能。

一个例子:

说文件F是语言列表。现在,DialogBox 1对列表做了一些操作(例如,添加了一种新语言);组合框更新F文件;这又触发了DataUpdatedEvent。4个对话框包含例如TComboBox,当它们弹出时会显示语言列表。我希望这4个框注意到更改,并使用新近更新的File更新它们自己的组合框内容...而不必担心组合框如何知道它们需要刷新其内容。如果按预期工作,则将保留Sender参数,并且将跳过触发dataUpdateEvent的对话框,因为该对话框已经被更新。毕竟,如果一个sender = self然后继续到下一个事件处理程序应该很容易实现。

所有这些都是因为我想锻炼自己的大脑...以预防老年痴呆症,我可能补充得不是很成功。


嗨,欢迎来到StackOverflow!这是否意味着要回答原始问题(“ Java中的事件侦听器和处理程序之间有什么区别?”)。如果是这样,重新定义它可能会有所帮助,以便它更直接地回答问题,并清楚地解释Java中事件侦听器与处理程序的特征。
Alex Lew

-1

这是语义。

  • 侦听器是接口。
  • 适配器是实现特定接口并为其方法提供空实现的类。如果您不必实现所有接口方法,这将有所帮助。
  • 处理程序实现多个接口或将调用委托给多个接口。

1
我不会说侦听器一定是接口。例如,BasicButtonListener是一个具体的类。
aioobe 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.