繁体   English   中英

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

[英]What's the difference between Event Listeners & Handlers in Java?

在 java 的一般术语中,有事件的侦听器和处理程序。
我的意思是我在不知不觉中使用它们,只是 API 中可用的那个。

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

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

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

听众和处理程序之间没有正式定义的区别。 有些人可能认为它们是可以互换的。 然而,对我而言,它们的含义略有不同。

侦听器是一个订阅来自源的事件的对象。 参看 观察者模式 通常你可以有很多的听众认购每种类型的事件,它们通过添加 add XyzListener方法。

示例: Java API中的MouseListener

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

示例: Java API中的MemoryHandler

最基本的区别是联想

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

一般来说,只有一个管理所有事件的中央处理程序管理器,而在监听器的情况下,每个想要监听的实体都必须管理自己的监听器集合

这是我看到它的方式:

听众会监视要解雇的事件。 例如, KeyListener等待KeyEvents, MessageListener等待消息到达队列,依此类推。

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

侦听器,侦听作为描述事件的数据值对象的事件。 事件发生时,事件的顺序通常很重要。 按键'0'后跟'1'与'1'和'0'不同。

处理程序,处理复杂对象,例如新的Socket连接。 处理程序可能会处理该对象任何时间长度。 对象创建和订购的时间并不那么重要。 来自client0或client1的连接可以按任何顺序发生。

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

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

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

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

EventHandler是在JavaFX中为所有UI控件引入的。 而监听器是为Observables借用的,例如属性。

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

我一直试图理解所有的信息,我迷失了。 我看过Delphi(Pascal),C,C ++,java ......没什么是清楚的。所以,经过一个月,这就是我看到的问题。 我可能完全偏离轨道,所以请礼貌地告诉我。

一个事件发送者,一个捕手,只要发件人注册捕手。 每次文件(其处理代码在4个对话框以外的其他模块中)发生变化时,我需要更新4个对话框。 我考虑过更新每个老式的方式,但后来我查看了Delphi事件和消息处理。 让我们来看看:

文件F(发件人)已完成阅读,并应通知Dialogs 1..4现在有数据供他们显示和用户使用。 什么是最好的?

尝试将Dialogs 1..4注册为侦听器,让Sender以某种方式触发OnUpdatedDataEvent?

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

请注意,事件保持耦合,而消息传递不...并且调试很麻烦。

而且我想知道File的代码块如何能够注册4个监听器(对话框)?

我正在看的是级联调用的可能性,这意味着调用者调用一个侦听器,调用下一个...直到它到达链的末尾。 我甚至怀疑这是否可能。

一个例子:

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

所有这一切,因为我想锻炼我的大脑...以防止阿尔茨海默氏症,不是很成功,我可能会补充。

假设您刚刚乘飞机降落在一个新目的地的机场。 有人在门口等你,或者有人会开出租车送你去酒店

等待的人是监听者(等待你到达的事件) 带你去酒店的人是事件处理者(你到达后的动作)

在 JS 中,侦听器等待事件(例如点击),处理程序在“点击”发生时做一些事情

这是语义学。

  • 监听器是界面。
  • Adapter是实现特定接口的类,为其方法提供空实现。 如果您不必实现所有接口方法,这将有所帮助。
  • Handler实现多个接口或委托对多个接口的调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM