Java中的事件监听器和处理器有什么区别?
在一般的术语中,有事件的监听器和处理程序。
我的意思是我在不知不觉中使用它们,只要在API中可用即可。
我的问题是,我们在什么情况下使用监听器,以及在什么情况下使用处理器来处理事件?
他们之间有什么区别? 特点?
我查找了原因,找不到Java的正确解释。
听众和处理者之间没有正式的区别。 有些人可能会认为它们是可以互换的。 对我而言,他们的意思稍有不同。
侦听器是订阅来自源的事件的对象。 参看 观察者模式 。 通常你可以有许多监听器为每种types的事件订阅,并且通过add XyzListener
方法来add XyzListener
。
示例: Java API中的MouseListener
。
处理程序是负责处理某些事件的对象。 一个典型的场景是为特定的事件/任务提供一个处理程序作为构造函数的参数,或者通过一set XyzHandler
方法设置处理程序。 换句话说,每种types的事件通常都有一个处理程序。
示例: Java API中的MemoryHandler
。
最基本的区别是联想
- 监听器与事件源 (例如:键盘)相关联
- 处理程序与事件 (例如:keydown)相关联
一般来说,只有一个pipe理所有事件的中央处理程序pipe理器,而在侦听器的情况下,每个想要侦听的实体将不得不pipe理它们自己的侦听器集合
这是我看到它的方式:
听众注视着要被解雇的事件。 例如, KeyListener
等待KeyEvent, MessageListener
等待消息到达队列等等。
处理程序负责处理事件。 通常情况下,听众和处理者是携手并进的。 例如,KeyListener告诉ExitHandler“字母Q被按下”,处理程序执行诸如清理资源和正常退出应用程序之类的逻辑。 类似的ButtonClickListener会告诉相同的ExitHandler“退出button被点击”。 所以,在这种情况下,你有两个不同的事件,两个不同的监听器,但一个处理程序。
监听器监听事件,这些事件是描述事件的数据值对象。 事件发生时,事件的顺序通常很重要。 按键“0”后跟“1”与“1”和“0”不同。
一个处理器,处理一个复杂的对象,例如一个新的Socket连接。 该处理程序可能会处理该对象的任何时间长度。 对象创build和订单的时间并不那么重要。 来自client0或client1的连接可以按任何顺序发生。
侦听器是一个事件发生时被通知的对象,它有两个主要的要求 – 1 – 它必须注册一个或多个来源来接收有关事件2的具体types的通知 – 它必须实现方法来接收和处理这些通知。 处理程序负责处理事件。
在我看来,最重要的不同在于,我们使用listener来处理每个事件的来源,相反,handler是每个事件types的。
它们在概念上是相同的东西 – 一个响应UI事件执行一些操作的对象。 一般来说,在Swing中,这些对象在外观层次上被称为“处理程序”(用于处理低级小部件事件),而在更抽象的用户界面层级上则被称为“侦听程序”(在这里你将实现你的应用程序逻辑)。
我认为这种差异是微妙的,因为一个具体的Listener也是一个事件处理程序,或者至less有一个可以被认为是事件处理程序的方法。 也就是说,一个具体的Listener在接收到一个事件对象(来自事件源)之后,处理或者pipe理对该事件的反应,其中包含刚发生的事件(事件源)的所有有用信息。 由于这个Listener必须实现一个xxxListener接口,这个接口迫使他至less实现一个事件源对象在事件发生时被执行的至less一个方法,所以Listener本身可以被认为是一个处理程序,更准确地说,由Listener对象实现的Listener接口可以被认为是真正的事件处理程序。 所以我查看事件处理程序只是作为对事件的反应执行的代码。 这与Listener对象是不同的,Obserner对象是一个更抽象概念的元素,例如Observerdevise模式。 这是我对这个问题的个人看法。
在JavaFX中为所有UI控件引入了EventHandler。 Listener是借用Observables,如物业。
EventHandler是区分可观察事件和UI事件的一种方法。
这是语义。
- 监听器是接口。
- 适配器是实现特定接口并为其方法提供空实现的类。 这有助于如果你不必实现接口的所有方法。
- 处理程序实现几个接口或委托调用几个接口。