DOC-07-04 使用事件处理器(Event Handler)

本章介绍JavaFX应用程序中的Event HandlerEvent Handler。你将学习如何使用Event Handler来处理键盘动作、鼠标动作、滚动动作和用户与程序之间的其它交互动作产生的事件。

Event Handler使你可以在事件处理的事件冒泡(Event Bubbling)阶段来处理事件。一个节点可以有一个或多个用来处理事件的Event Handler。一个处理器可以被多个节点使用,并且可以处理多种不同的事件类型。如果子节点的Event Handler没有消耗掉对应的事件,则父节点的Event Handler可以使父节点在子节点处理完事件之后继续对事件作出响应,并且为多个子节点提供通用的事件处理机制。

注册和移除一个Event Handler

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

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

例4-1 注册Event Handler

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

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

例4-2 移除一个Event Handler

小贴士:要想通过快捷方法移除一个已经注册的Event Handler,给快捷方法传入一个null参数即可,例如:node1.setOnMouseDragged(null)。

使用Event Handler

Event Handler一般被用在事件分派链的叶子节点或者分支节点上,并且在事件处理的事件冒泡阶段被调用。可以在分支节点上使用Event Handler来执行一个动作,例如为所有子节点定义默认响应。

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

键盘(Keyboard)样例

Keyboard样例展示了处理器的如下用法:

● 为两个不同的事件类型注册一个Event Handler

● 在父节点中为所有的子节点提供通用事件处理方式

图4-1展示了Keyboard样例程序运行后的屏幕截图。它的用户界面由4个字母组成,每个字母都在一个正方形中,表示键盘上相应的按键。屏幕上第一个按键是高亮显示的,表示它当前获得了焦点。使用键盘上的左右箭头方向键将焦点移到屏幕上不同的按键之上。

图4-1 Keyboard样例程序的初始界面

7_4_1 initial_keyboard-screen

当按下回车键时,屏幕上获取焦点的按键就会变成红色。松开回车键时,屏幕上的按键就会恢复为原来的颜色。当按下的按键与屏幕上某个按键一致时该按键就会变红,松开键盘上的按键时屏幕上的按键就会恢复为原来的颜色。如果按下的按键与屏幕上的4个按键都不一致,则不会发生任何事情。图4-2展示了屏幕上的A键获取了焦点而键盘上的D键被按下时的屏幕截图。

图4-2 按键被按下时的截图

7_4_2 key_pressed_screen

Keyboard样例的Event Handler

在Keyboard样例程序中,屏幕上展示的每个按键由一个按键节点(keyNode)表示。所有的按键包含在一个键盘节点(keyboardNode)中。每个keyNode都有一个Event Handler用于在按键获取焦点时接收按键事件。Event Handler通过改变屏幕上按键的颜色来响应回车键的按下和释放的事件。随后对应的事件将会被消耗掉,这样父节点keyboardNode不会再接收到该事件。

例4-3展示了为keyNode定义Event Handler的installEventHandler()方法。

例4-3 按键节点keyNode的Event Handler

键盘节点keyboardNode有两个Event Handler,它们用来处理未被按键节点keyNode的Event Handler消耗掉的按键事件。第一个Event Handler改变与按下的按键相同的keyNode的颜色。第二个Event Handler响应左右箭头方向键并移动焦点。

例4-4展示了为键盘节点keyboardNode定义Event Handler的installEventHandler()方法。

例4-4 键盘节点的Event Handler

监听按键按下事件的两个Event Handler被会认为是同级别的Event Handler。因此,即使其中一个的Event Handler消耗掉了事件,另外一个Event Handler依然会被调用。

附加资源

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

应用程序文件

源码

KeyboardExample.java

NetBeans工程

KeyboardExample.zip

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