事件凸显阶段
事件目标到达且注册过滤器已处理了事件,则事件沿着事件链表返回到根节点。如图
1-3 中的链表,在事件凸显阶段,事件从三角形遍历到 Stage 节点。
链表中任意节点为遇到的事件类型注册了处理器,则处理器会被调用。当处理器处理完
毕,事件向上返回下个节点。日光没有注册处理器,则直接返回上一节点。如果没有处理器
销毁事件,根节点最终接受到事件并完成处理。
1.1.5 事件处理
事件处理有过滤器和处理器提供,它们实现了 EventHandler 接口。如果需要在事件发生
时通知应用,注册一个事件过滤器或处理器。过滤器和处理器两者的主要不同是何时被执行。
事件过滤器
事件过滤器在事件捕获期间被执行。父节点的事件过滤器为多子节点提供一般的事件处
理,如果需要,可以销毁事件来阻止子节点接收事件。随着事件沿着注册了过滤器的节点传
递,过滤器为出现的注册事件类型执行。
一个节点可以注册多个过滤器。每个过滤器调用的次序基于事件的等级。特定过滤器优
先一般过滤器而执行。例如,MouseEvent.MOUSE_PRESSED 事件过滤器优先 InputEvent.ANY
事件而执行。同级别的过滤器执行顺序没有规定。
事件处理器
事件处理器在事件凸显阶段被执行。如果子节点的事件处理器没有销毁事件,父节点的
事件处理器将在子节点处理后执行事件,并且为多个子节点提供通用的事件处理。为出现的
事件类型注册的处理器,随事件经由注册了处理器的节点而被执行。
一个节点可以注册多个处理器,调用顺序基于事件类型的层级而定。特定类型的事件处
理 器 优 先 一 般 类 型 而 执 行 。 例 如 KeyEvent.KEY_TYPED 处理器优先
InputEvent.ANY 而执行。 同级别的处理器执行次序没有特别规定。
销毁事件
事件可以有过滤器或处理器在事件链表人一点调用 consume()方法销毁。这个方法发生
时间完成处理的信号,然后事件派发链表遍历结束。
在过滤器中销毁事件会阻止链表中任意子节点执行事件。销毁处理器中的事件,会阻止
链表中父节点进一步处理事件。如果节点注册了多个过滤器或处理器,则对等的过滤器或处
理器依然会被执行。
注意:UI 控件的缺省处理器大都销毁了多数的输入事件。更多相关信息可以查看“JavaFX
API 文档”。
1.2 使用便利的方法
本篇主题是描述在 JavaFX 应用中可以用于注册事件处理器的便利方法,即学习一种简
单的方法来创建和注册事件处理器,以对鼠标事件、键盘事件、行为事件、拖放事件、窗口