DOC-07-03 使用事件过滤器(Event Filter)

本章介绍JavaFX应用程序中的事件过滤器(Event Filter)。你将会学到如何使用Event Filter来处理由键盘动作、鼠标动作、滚动动作以及其它用户与程序之间的交互动作所产生的事件。

Event Filter使你可以在事件处理过程中的事件捕获阶段来处理事件。一个节点可以有一个或多个Event Filter来处理一个事件。一个Event Filter可以被多个节点使用并可以处理多种不同的事件类型。Event Filter使父节点可以为所有的子节点来提供通用的事件处理或者是拦截住事件以使子节点不再响应该事件。

注册和移除EventFilter

要在事件捕获阶段处理事件,对应的节点必须要注册一个Event Filter。Event Filter是EventHandler接口的一个实现。该接口的handle()方法提供了当对应节点接收到与Event Filter关联的特定事件时需要被执行的代码。

要注册Event Filter可以使用addEventFilter()方法。该方法接收事件类型和Event Filter实例作为参数。在例3-1中,第一个Event Filter被添加到了一个节点之上并指定处理一种特定的事件类型。第二个Event Filter被定义为处理输入事件,并被注册到了两个不同的节点之上。同一个Event Filter也被注册监听两种不同类型的事件。

例3-1 注册过滤器

需要注意的是,为某一种类型的事件定义的Event Filter也同样可被用于该事件类型的任何子类型事件。查看“事件类型”章节可以了解关于事件类型层级关系的信息。

如果你希望某Event Filter不再为某节点处理事件或不再处理某种事件类型的事件,可以使用removeEventFilter()方法移除该Event Filter。该方法接收事件类型和Event Filter实例作为参数。在例3-2中,为myNode1节点移除掉了在例3-1中定义的MouseEvent.MOUSE_PRESSED事件类型的Event Filter。该Event Filter仍然会通过KeyEvent.KEY_PRESSED事件被myNode2和myNode1执行。

例3-2 移除一个Event Filter

使用Event Filter

Event Filter一般被用在事件分派链的分支节点上,并且在事件处理的事件捕获阶段被调用。使用Event Filter来执行一个动作,例如重新定义事件响应或阻止事件到达其目标。

要查看Event Filter的使用样例,请下载DraggablePanelsExample.zip文件。解压该NetBeans工程并在NetBeansIDE中打开。接下来的部分介绍了在该样例中使用的Event Filter。

可拖拽面板(Draggable Panels)样例

Draggable Panels样例展示了Event Filter的如下用法:

● 通过为父事件类型注册Event Filter来为子类型提供通用事件处理方式

● 消耗掉事件以阻止子节点响应该事件

图3-1是Draggable Panels样例启动以后的界面截图。用户界面由三个面板(Panel)组成。每个Panel包含不同的UI控件。在屏幕底部有一个复选框用于控制Panel是否可以被拖拽。

图3-1 Draggable Panels样例的初始屏幕

7_3_1 initial_panels_screen

如果该复选框未被选中,点击Panel中的任意控件都会得到控件的响应。如果该复选框被选中了,则每个控件都不再会响应鼠标点击事件。取而代之的是,点击Panel中的任何地方并拖拽鼠标会移动整个Panel,这使你能够改变Panel的位置,如图3-2所示。

图3-2 带有被重新定位的Panel的界面截图

7_3_2 modified_panels_screen

Draggable Panels样例中的Event Filter

在Draggable Panels样例中,三个Panel在创建时都调用了makeDraggable()方法来使之可以移动。对应的方法和Event Filter的定义如例3-3所示。

例3-3 makeDraggable()中的Event Filter定义

为每个Panel都注册并定义了如下事件的Event Filter:

● ANY:这个Event Filter为Panel处理了所有的鼠标事件。如果Drag Mode复选框被选中,则Event Filter会消费掉所有的鼠标事件,作为子节点,面板中所有的UI控件都不会再接收到鼠标事件。如果复选框未被选中,则鼠标光标所在位置的控件就会处理该事件。

● MOUSE_PRESSED:该Event Filter只为Panel处理鼠标按下事件。如果Drag Mode复选框被选中,鼠标的当前位置就会被存储下来。

● MOUSE_DRAGGED:该Event Filter只为Panel处理鼠标拖拽事件。如果Drag Mode复选框被选中,该Panel就会被移动。

需要注意的是,一个Panel注册了三个Event Filter。特定事件类型的Event Filter会在父事件类型调用之前调用,因此MouseEvent.MOUSE_PRESSED事件和MouseEvent.MOUSE_DRAGGED事件的Event Filter会在MouseEvent.ANY事件的Event Filter之前调用。

附件资源

有关Event Filter更多的信息,请参考JavaFX的 API文档

应用程序文件

源代码

DraggablePanelsExample.java

NetBeans工程

DraggablePanelsExample.zip

打赏一下
支付宝
微信
除非注明,博客文章均为原创,转载请标明文章地址
本文地址: http://www.javafxchina.net/blog/2015/09/doc0703-event-filter/
百度已收录