Javafx 简明教程

JavaFX - Event Handling

在 JavaFX 中,我们可以开发 GUI 应用程序、Web 应用程序和图形应用程序。在这样的应用程序中,用户与应用程序(节点)交互时,就会说有一个事件已经发生。

例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目、滚动页面都是导致事件发生的活动。

Types of Events

事件可以大致分为以下两类 −

  1. Foreground Events − 这些事件需要用户直接交互。它们是在人和图形用户界面的图形组件交互后生成的结果。例如,单击按钮、移动鼠标、通过键盘输入字符、从列表中选择项目、滚动页面等。

  2. Background Events − 这些事件不需要最终用户交互,称为后台事件。操作系统中断、硬件或软件故障、计时器过期、操作完成是后台事件的示例。

Events in JavaFX

JavaFX 提供支持以处理各种事件。名为 Event 的包中的类是事件的基本类。

任何其子类的实例都是一个事件。JavaFX 提供了各种各样的事件。其中一些如下所示。

  1. Mouse Event − 当单击鼠标时发生的输入事件。它由名为 MouseEvent 的类表示。它包括单击鼠标、按下鼠标、释放鼠标、移动鼠标、鼠标进入目标、鼠标退出目标等操作。

  2. Key Event − 这是一种输入事件,表示节点上发生按键操作。它由名为 KeyEvent 的类来表示。此事件包括按下按键、释放按键和键入按键等操作。

  3. Drag Event − 当拖动鼠标时发生的输入事件。它由名为 DragEvent 的类来表示。它包括拖动进入、拖动释放、拖动进入目标、拖动退出目标、拖动等操作。

  4. Window Event − 这是一种与窗口显示/隐藏操作相关的事件。它由名为 WindowEvent 的类来表示。它包括窗口隐藏、窗口显示、窗口已隐藏、窗口显示等操作。

Event Handling

事件处理是控制事件的机制,并决定如果事件发生,该发生什么。此机制具有称为事件处理程序的代码,当事件发生时执行该代码。

JavaFX 提供处理程序和过滤器来处理事件。在 JavaFX 中,每个事件都有 −

  1. Target − 事件发生的节点。目标可以是窗口、场景和节点。

  2. Source − 产生事件的源将是事件的源。在以上场景中,鼠标是事件的源。

  3. Type − 发生的事件的类型;在鼠标事件的情况下 – 鼠标按下、鼠标释放是事件的类型。

假设我们有一个应用程序,其中插入了一个圆形、停止和播放按钮,如下所示,使用了一个组对象 −

sample application

如果单击播放按钮,源将是鼠标,目标节点将是播放按钮,并且生成的事件的类型是鼠标点击。

Phases of Event Handling in JavaFX

每当产生事件时,JavaFX 会经历以下阶段。

Route Construction

每次生成一个事件时,事件的默认/初始路由由 Event Dispatch chain 的构建来确定。它从舞台到源节点的一条路径。

在上面的场景中,当我们点击播放按钮时,以下是为所生成的事件分发的事件分发链。

play button

Event Capturing Phase

在构建事件分发链之后,应用程序的根节点分发该事件。此事件会传递到分发链中的所有节点(从上到下)。如果其中任何一个节点具有为所生成事件注册的 filter ,它将被执行。如果分发链中的任何节点都没有针对所生成事件的过滤器,则它将被传递到目标节点,最后目标节点将处理该事件。

Event Bubbling Phase

在事件冒泡阶段,事件从目标节点到舞台节点(从下到上)传递。如果事件分发链中的任何一个节点具有为所生成事件注册的 handler ,它将被执行。如果所有这些节点都没有处理器来处理事件,则事件将到达根节点,最终进程将完成。

Event Handlers and Filters

事件过滤器和处理器包含用于处理事件的应用程序逻辑。一个节点可以注册到多个处理器/过滤器。对于父子节点,您可以为父节点提供一个公共过滤器/处理器,此过滤器/处理器作为所有子节点的默认值进行处理。

如上文所述,在事件处理期间,过滤器将被执行,在事件冒泡阶段,处理器将被执行。所有处理器和过滤器都实现包 javafx.event 的接口 EventHandler