Delegation Event Model in Java2025年5月3日 | 阅读 6 分钟 委托事件模型是为了处理 GUI 编程语言中的事件而定义的。GUI 代表图形用户界面,用户在该界面中以图形/视觉方式与系统进行交互。 GUI 编程本质上是事件驱动的;每当用户发起诸如鼠标活动、单击、滚动等操作时,每个操作都称为一个事件,该事件会映射到代码以响应用户的函数。这称为事件处理。 在本节中,我们将讨论事件处理以及如何在 Java 中实现委托事件模型。我们还将讨论事件模型中的不同组件。 Java 中的事件处理Java 自 Java 1.0 起就支持事件处理。它为 AWT(抽象窗口工具包)提供了支持,AWT 是一个用于开发桌面应用程序的 API。在 Java 1.0 中,AWT 基于继承。要捕获和处理程序的 GUI 事件,它应该继承 GUI 组件的子类并覆盖 action() 或 handleEvent() 方法。下图演示了事件处理。 ![]() 但是,现代事件处理方法基于委托模型。它定义了一种标准且兼容的生成和处理事件的机制。在此模型中,源会生成一个事件并将其转发给一个或多个侦听器。侦听器会等待直到收到事件。一旦收到事件,它就会被侦听器处理并返回。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 程序。 设计目标事件委托模型的设计目标如下
让我们通过一个例子来实现它 实现事件委托模型的 Java 程序下面是一个实现事件委托模型的 Java 程序,用于处理事件 TestApp.java 输出 ![]() 正在搜索... |
在面向对象编程中,数组是一种以线性方式存储同构数据的结构。数组的大小是固定的,即一旦声明,数组的大小就不能修改。换句话说,数组存储相同类型的数据(int、float、string,...
阅读 8 分钟
在面向对象编程领域,单一职责原则(SRP)是一个基本概念,它在创建干净、可维护和可扩展的代码方面起着至关重要的作用。SRP 是 SOLID 原则之一,SOLID 原则是一套旨在改进软件设计和架构的设计原则……
阅读 6 分钟
Java 中的多线程 在 Java 中,多线程是指并发运行两个或多个线程的能力。在程序内可以独立运行的最小进程单元称为线程。多线程主要用于通过同时执行多个任务来提高程序性能。Java 的……
阅读 4 分钟
java.nio.DoubleBuffer 有一个 mark() 函数。通过 DoubleBuffer 类,将此 DoubleBuffer 的当前位置标记为缓冲区的标记。语法:public DoubleBuffer mark()返回值:将缓冲区的标记设置为当前位置,并返回此方法返回的缓冲区。示例……
阅读 3 分钟
ExecutorService.execute() 和 submit() 方法用于将任务提交给 ExecutorService 对象。execute() 方法接受一个 Runnable 任务,而 submit() 方法接受 Runnable 和 Callable 任务。execute() 方法没有返回值,而 submit() 方法返回……
阅读 4 分钟
计算机科学和编程领域有许多有趣的问题,它们不仅挑战开发人员,还为高效的算法解决方案提供了见解。其中一个问题是范围加法问题,它经常在各种面试、竞争性设计竞赛和实际应用中遇到...
阅读 6 分钟
在 Java 中,死锁是多线程的一部分。多线程环境允许我们同时运行多个线程以进行多任务处理。有时线程会发现自己处于永久等待状态,这就是死锁情况。死锁是两个或多个线程尝试...
5 分钟阅读
1997 年,Sun Microsystems 和 IBM 决定解决软件的访问启用问题。他们的目标是开发一种可访问性 API,应用程序开发人员可以将其实现到 Java 类库中,以使应用程序可访问。结果,Sun Microsystems 编写了可访问性 API 和...
阅读 3 分钟
LU 分解 LU 分解,也称为 LU 因子分解。它是数值线性代数中的一种基本技术,其中一个方阵被分解为一个下三角矩阵 L 和一个上三角矩阵 U。对于 n×n 矩阵 A,目标是将其表示为...
11 分钟阅读
任务是确定给定序列中缺失的数字。数组将包含此范围内的所有数字,除了一个。查找缺失数字的方法朴素方法:使用哈希此方法涉及创建一个辅助数组(hashArray)来跟踪频率...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India