Delegation Event Model in Java

2025年5月3日 | 阅读 6 分钟

委托事件模型是为了处理 GUI 编程语言中的事件而定义的。GUI 代表图形用户界面,用户在该界面中以图形/视觉方式与系统进行交互。

GUI 编程本质上是事件驱动的;每当用户发起诸如鼠标活动、单击、滚动等操作时,每个操作都称为一个事件,该事件会映射到代码以响应用户的函数。这称为事件处理。

在本节中,我们将讨论事件处理以及如何在 Java 中实现委托事件模型。我们还将讨论事件模型中的不同组件。

Java 中的事件处理

Java 自 Java 1.0 起就支持事件处理。它为 AWT(抽象窗口工具包)提供了支持,AWT 是一个用于开发桌面应用程序的 API。在 Java 1.0 中,AWT 基于继承。要捕获和处理程序的 GUI 事件,它应该继承 GUI 组件的子类并覆盖 action() 或 handleEvent() 方法。下图演示了事件处理。

Delegation Event Model in Java

但是,现代事件处理方法基于委托模型。它定义了一种标准且兼容的生成和处理事件的机制。在此模型中,源会生成一个事件并将其转发给一个或多个侦听器。侦听器会等待直到收到事件。一旦收到事件,它就会被侦听器处理并返回。UI 元素能够将事件的处理委托给单独的函数。

委托事件模型的关键优势在于应用程序逻辑与界面逻辑完全分离。

在此模型中,侦听器必须与源连接才能接收事件通知。因此,只有希望接收事件的侦听器才能接收到事件。所以,这种方法比基于继承的事件模型(在 Java 1.0 中)更方便。

在旧模型中,事件会一直传播到包含组件,直到一个组件处理它。这需要组件接收未处理的事件,这花费了很多时间。委托事件模型克服了这个问题。

基本上,事件模型基于以下三个组件

  • 事件
  • 事件源
  • 事件侦听器

事件

事件是定义源中状态更改的对象。事件可以作为用户在与 GUI 元素交互时的反应而生成。一些事件生成活动包括移动鼠标指针、单击按钮、按下键盘按键、从列表中选择项目等。我们还可以将许多其他用户操作视为事件。

事件也可能发生,但可能与用户交互无关,例如定时器到期、计数器超出、系统故障或任务完成等。我们可以为任何应用的动作定义事件。

事件源

源是引起和生成事件的对象。当对象的内部状态发生变化时,它会生成一个事件。源可以生成几种不同类型的事件。

源必须注册一个侦听器以接收特定事件的通知。每个事件都包含其注册方法。以下是示例

从上面的语法中,Type 是事件的名称,e1 是事件侦听器的引用。例如,对于键盘事件侦听器,该方法将称为 **addKeyListener()**。对于鼠标事件侦听器,该方法将称为 **addMouseMotionListener()**。当使用相应的源触发事件时,所有事件都将通知已注册的侦听器并接收事件对象。这个过程称为事件多播。在某些情况下,事件通知只会发送给注册接收它们的侦听器。

一些侦听器只允许一个侦听器注册。以下是示例

从上面的语法中,Type 是事件的名称,e2 是侦听器的引用。当指定事件发生时,它将通知已注册的侦听器。这个过程称为事件**单播**。

如果需要,源应包含一个方法来从侦听器中取消注册特定类型的事件。以下是一个将从侦听器中删除事件的方法示例

从上面的语法中,Type 是事件名称,e2 是侦听器的引用。例如,要删除键盘侦听器,将调用 **removeKeyListener()** 方法。

源提供用于添加或删除生成事件的侦听器的方法。例如,Component 类包含用于操作不同类型事件的方法,例如将它们添加或删除到侦听器。

事件侦听器

事件侦听器是一个在事件触发时被调用的对象。侦听器需要两样东西;首先,它必须与源注册;但是,它可以与多个源注册以接收事件通知。其次,它必须实现接收和处理已收到通知的方法。

处理事件的方法定义在一组接口中。这些接口可以在 java.awt.event 包中找到。

例如,**MouseMotionListener** 接口在鼠标被拖动和移动时提供两个方法。任何对象都可以通过实现 MouseMotionListener 接口来接收和处理这些事件。

事件类型

事件分为以下两类

前台事件

前台事件是指需要用户直接交互的事件。这些类型的事件是用户与 GUI 组件交互的结果。例如,单击按钮、鼠标移动、按下键盘按键、从列表中选择选项等。

后台事件

后台事件是指非最终用户交互的结果事件。例如,操作系统中断系统故障(硬件或软件)。

要处理这些事件,我们需要一个事件处理机制来提供对事件和响应的控制。

委托模型

委托模型自 Java 1.1 起在 Java 中可用。它提供了一种新的基于委托的事件模型,使用 AWT 来解决事件问题。它提供了一种方便的机制来支持复杂的 Java 程序。

设计目标

事件委托模型的设计目标如下

  • 易于学习和实现
  • 它支持应用程序和 GUI 代码之间的清晰分离。
  • 它提供了健壮的事件处理程序代码,不易出错(强大的编译时检查)
  • 它具有灵活性,可以为事件流和传播启用不同类型的应用程序模型。
  • 它支持运行时发现组件生成的事件以及可观察的事件。
  • 它提供了与先前模型的向后二进制兼容性支持。

让我们通过一个例子来实现它

实现事件委托模型的 Java 程序

下面是一个实现事件委托模型的 Java 程序,用于处理事件

TestApp.java

输出

Delegation Event Model in Java

正在搜索...