在java的一般术语中,有听众和&事件处理程序。
我的意思是我在不知不觉中使用它们,无论API中有哪些。
我的问题是,在什么情况下我们使用侦听器,在什么情况下我们使用处理程序进行事件?
它们之间的区别是什么?特性??
我搜索了原因,但我无法找到适当的Java解释。
答案 0 :(得分:55)
侦听器和处理程序之间没有正式定义的区别。有些人可能认为它们是可以互换的。然而,对我而言,它们的含义略有不同。
侦听器是一个订阅来自源的事件的对象。参看observer pattern。通常,您可以为许多类型的事件订阅许多侦听器,并且通过addXyzListener
方法添加。
示例: Java API中的MouseListener
。
处理程序是一个负责处理某些事件的对象。典型的场景是为特定事件/任务提供处理程序作为构造函数的参数,或者通过setXyzHandler
方法设置处理程序。换句话说,对于每种类型的事件,您通常都有一个处理程序。
示例: Java API中的MemoryHandler
。
答案 1 :(得分:30)
最基本的区别是关联
一般来说,只有一个中央处理程序管理器管理所有事件,而在监听器的情况下,每个想要监听的实体都必须管理自己的监听器集合
答案 2 :(得分:20)
这就是我看到它的方式:
侦听器会监视要触发的事件。例如,KeyListener
等待KeyEvents,MessageListener
等待消息到达队列,依此类推。
处理程序负责处理事件。通常情况下,听众和处理人员齐头并进。例如,KeyListener告诉ExitHandler“按下了字母Q”,处理程序执行逻辑,例如清理资源和正常退出应用程序。类似的ButtonClickListener会告诉同一个ExitHandler“单击”退出按钮“。因此,在这种情况下,您有两个不同的事件,两个不同的侦听器,但只有一个处理程序。
答案 3 :(得分:4)
侦听器,侦听作为描述事件的数据值对象的事件。事件发生时,事件的顺序通常很重要。按键'0'后跟'1'与'1'和'0'不同。
处理程序,处理复杂对象,例如一个新的Socket连接。处理程序可能会处理该对象任何时间长度。对象创建和订购的时间并不那么重要。来自client0或client1的连接可以按任何顺序进行。
答案 4 :(得分:3)
侦听器是在事件发生时得到通知的对象,它有两个主要要求 - 1 - 它必须已在一个或多个来源注册,以接收有关特定类型事件的通知 2 - 它必须实现接收和处理这些通知的方法。 处理程序负责处理事件。
答案 5 :(得分:3)
我认为差异很微妙,因为具体的Listener也是一个事件处理程序,或者至少有一个可以被视为事件处理程序的方法。 也就是说,具体的侦听器在接收到事件对象(来自事件源)之后处理或管理对事件的反应,其中包含有关刚刚发生的事件的所有有用信息(在事件源上)。 由于这个Listener必须实现一个xxxListener接口,迫使他实现至少一个方法,该方法在事件发生时由事件源对象执行,因此Listener本身可以被认为是一个处理程序,更确切地说,是Listener对象实现的Listener接口可以被认为是真正的事件处理程序。 所以我将事件处理程序视为响应事件而执行的代码。 这与Listener对象不同,后者是更抽象概念的元素,例如Observer设计模式。 这是我对这个主题的个人看法。
答案 6 :(得分:3)
在我看来,最重要的区别在于我们使用每个事件源的侦听器,而不是每个事件类型的处理程序。
答案 7 :(得分:2)
它们在概念上是相同的 - 一个对象执行一些操作以响应UI事件。通常,在Swing中,这些对象在外观级别(用于处理低级窗口小部件事件)称为“处理程序”,在更抽象的UI级别称为“侦听器”(您将在其中实现应用程序逻辑) )。
答案 8 :(得分:0)
在JavaFX中为所有UI控件引入了EventHandler。而监听器是为Observables借用的,例如属性。
EventHandler是一种区分可观察事件和ui事件的方法。
答案 9 :(得分:0)
我一直试图理解所有信息而且我迷失了。我看过Delphi(Pascal),C,C ++,java ......没什么是清楚的。所以,经过一个月,这就是我看到的问题。我可能完全偏离轨道,所以请礼貌地告诉我。
一个事件发件人,一个捕手,只要发件人注册捕手。每次文件(其处理代码在4个对话框以外的其他模块中)发生变化时,我需要更新4个对话框。我考虑过更新每个老式的方式,但后来我查看了Delphi事件和消息处理。我们来看看:
文件F(发件人)已完成阅读,并应通知Dialogs 1..4现在有数据供他们显示和用户使用。什么是最好的?
尝试将Dialogs 1..4注册为侦听器并让Sender以某种方式触发OnUpdatedDataEvent?
尝试在系统中发送消息,希望Dialogs 1..4能够捕获它吗?
请注意,事件保持耦合,而消息传递不会......并且调试很麻烦。
我确实想知道File的代码块如何能够注册4个监听器(对话框)?
我所看到的是级联调用的可能性,这意味着调用者调用一个侦听器,调用下一个...直到它到达链的末尾。我甚至怀疑这是否可能。
一个例子:
Say File F是一个语言列表。现在,DialogBox 1对列表做了一些事情(例如添加了一种新语言);该组合框更新F文件;这反过来会触发DataUpdatedEvent。例如,4个对话框包含TComboBoxes,它们在弹出时显示语言列表。我希望4个框能够注意到更改并使用新更新的文件更新自己的组合框内容...而不必担心组合框如何知道他们需要刷新其内容。如果它按照设想的方式工作,则Sender参数将被携带,并且将触发触发dataUpdateEvent的对话框,因为它已经被更新。毕竟if sender = self然后继续下一个事件处理程序应该很容易实现。
所有这一切都是因为我想锻炼我的大脑...以防止阿尔茨海默氏症,我可能不会非常成功。
答案 10 :(得分:-1)
这是语义学。