您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 资产评估/会计 > JavaFX2专题教程-之-事件处理
1JavaFX事件处理在JavaFX应用中,事件就是通知有什么事发生了。当用户点击按钮、敲击键盘、移动鼠标或执行别的行为时,事件就会被派遣;而在应用内住处事件过滤器和事件处理器来接收事件,并作出响应。这部分教程介绍如何处理事件,并提供相应事件处理的例子。内容包括:事件处理:介绍JavaFX应用中如何处理事件的基础架构;使用事件的便捷方法:介绍了最简洁的用户与应用交互事件的处理方法;使用事件过滤器:通过示例说明事件过滤器如何用于处理事件;使用事件处理器:通过示例说明事件处理器如何用于处理事件。1.1事件处理这部分主题是描述javaFX应用中的事件以及事件处理。通过这部分内容来学习事件类型、事件目标、事件捕获、事件凸显(EventBubbling)以及事件处理系统的基础架构。事件适用于通知应用的用户行为并使应用对事件做出响应。JavaFX平台提供了事件捕获的结构、事件目标路由,并根据需要使应用能处理相应事件。1.1.1事件(Events)一个事件代表了对应用有意义的事情的出现,如移动鼠标、敲击键盘等。在JavaFX中,一个事件是javafx.event.Event类的实例,或是任意的Event子类。JavaFX提供了好几种事件,包括DragEvent、KeyEvent、MouseEvent、ScrollEvent以及其它。也可扩展Event类来定义自己的事件。每类事件包含的信息如表1-1所示。表1-1事件特性特性描述事件类型发生事件的类型事件源事件源,对事件派遣链列表中事件位置的响应。源会随事件在链表中的传递而改变目标即发生行为的节点和时间链表中最终节点。目标不改变,但若在事件捕获节点被事件过滤器销毁,则目标不会接受到事件。每个事件类型的子类事件都提供了相应特定的附加信息。例如MouseEvent类包括了哪个按钮被按的信息、按按钮的次数以及鼠标的位置等。1.1.2事件类型(EventTypes)事件类型是EventType类的实例。单个事件类型进一步可分为多个类型。如KeyEvent类包含如下事件类型:KEY_PRESSEDKEY_RELEASEDKEY_TYPED事件类型是分层的,每个事件类型有个名字和超类。例如按键事件的名字是KEY_PRESSED,超类型是KeyEvent.ANY。顶层事件的超类事件类型是null。图1-1展示了事件类型的层级结构一子集。图1-1事件类型层级在事件层级关系中顶级事件类型是Event.ROOT,等价于Event.ANY。在子类型中,ANY类型用于表示任意事件类。例如,为实现对任意键盘事件的响应,可使用KeyEvent.ANY类型来作为事件过滤器或处理器;而对于只要响应释放键事件,使用KeyEvent.KEY_RELEASED类型来过来或处理。1.1.3事件目标(EventTargets)事件目标可以是任何实现了EventTarget接口类的实例。buildEventDispatchChain的实现,创建了事件派发链表,且事件必须依此链表到达目标。Window、Scene和Node类实现了EventTarget接口,且子类也继承了浙西实现。因此用户界面中大多数元素拥有定义好的事件派发链表,以便能集中事件响应,而不需要创建事件派发链表。如果是自定义UI控件来响应用户行为,且控件使Window、Scene或Node的子类,那么控件通过继承也是个事件目标。如果控件或控件元素不是Window、Scene或Node子类,则必须自行实现控件或元素的EventTarget接口。例如,MenuBar控件通过继承成为事件目标,而MenuItem元素必须实现EventTarget接口才能接受事件。1.1.4事件派送流程事件派送流程包含如下几步:1.目标选择;2.路由构建;3.事件捕获;4.事件凸显目标选择当行为发生时,系统基于内部规则决定哪个节点是目标。对于键盘事件,目标就是节点用于焦点;对于鼠标或滚动事件,目标就是节点所在的光标的位置。如光标所在的位置有多个节点,则以最上的为目标。例如,如果用户点击图1-2中三角形,则三角形是目标而不是包含三角形和圆形的矩形。当鼠标按下,则目标选定,所有后续鼠标事件被派送到相同目标,直到按钮释放为止。图1-2用户界面事件目标路由构建初始的事件路由有事件派发链表决定,链表是由选中的事件目标的buildEventDispatchChain()方法实现。例如,如果用户点击了图1-2的三角形,则初始路由如图1-3中灰色节点所示。当布景图作为事件目标时,初始事件路由开始于Node类的buildEventDispatchChain()方法的缺省实现,即由Stage到自身。图1-3事件派遣链表在事件过滤器和事件处理器沿着路由处理事件时,路由可以被改变。也就是说,如果过滤器或处理器在任一点销毁了事件,在初始路由上的接点就接受不到事件了。事件捕获阶段在事件捕获阶段,事件有应用根节点派发,并沿着派发链表向下传递到目标接点。图1-3使用了事件派发链表,在捕获阶段,事件遍历了从Stage节点到三角形节点。如果链表中任何节点注册了相应事件类型的过滤器,则过滤器会被调用。当过滤完成,事件被传递到链表中下一个节点。如果没有节点没有注册过滤器,则事件传递链表的下一个节点。如果没有过滤器消费事件,则事件目标最终接受并处理事件。事件凸显阶段事件目标到达且注册过滤器已处理了事件,则事件沿着事件链表返回到根节点。如图1-3中的链表,在事件凸显阶段,事件从三角形遍历到Stage节点。链表中任意节点为遇到的事件类型注册了处理器,则处理器会被调用。当处理器处理完毕,事件向上返回下个节点。日光没有注册处理器,则直接返回上一节点。如果没有处理器销毁事件,根节点最终接受到事件并完成处理。1.1.5事件处理事件处理有过滤器和处理器提供,它们实现了EventHandler接口。如果需要在事件发生时通知应用,注册一个事件过滤器或处理器。过滤器和处理器两者的主要不同是何时被执行。事件过滤器事件过滤器在事件捕获期间被执行。父节点的事件过滤器为多子节点提供一般的事件处理,如果需要,可以销毁事件来阻止子节点接收事件。随着事件沿着注册了过滤器的节点传递,过滤器为出现的注册事件类型执行。一个节点可以注册多个过滤器。每个过滤器调用的次序基于事件的等级。特定过滤器优先一般过滤器而执行。例如,MouseEvent.MOUSE_PRESSED事件过滤器优先InputEvent.ANY事件而执行。同级别的过滤器执行顺序没有规定。事件处理器事件处理器在事件凸显阶段被执行。如果子节点的事件处理器没有销毁事件,父节点的事件处理器将在子节点处理后执行事件,并且为多个子节点提供通用的事件处理。为出现的事件类型注册的处理器,随事件经由注册了处理器的节点而被执行。一个节点可以注册多个处理器,调用顺序基于事件类型的层级而定。特定类型的事件处理器优先一般类型而执行。例如KeyEvent.KEY_TYPED处理器优先InputEvent.ANY而执行。同级别的处理器执行次序没有特别规定。销毁事件事件可以有过滤器或处理器在事件链表人一点调用consume()方法销毁。这个方法发生时间完成处理的信号,然后事件派发链表遍历结束。在过滤器中销毁事件会阻止链表中任意子节点执行事件。销毁处理器中的事件,会阻止链表中父节点进一步处理事件。如果节点注册了多个过滤器或处理器,则对等的过滤器或处理器依然会被执行。注意:UI控件的缺省处理器大都销毁了多数的输入事件。更多相关信息可以查看“JavaFXAPI文档”。1.2使用便利的方法本篇主题是描述在JavaFX应用中可以用于注册事件处理器的便利方法,即学习一种简单的方法来创建和注册事件处理器,以对鼠标事件、键盘事件、行为事件、拖放事件、窗口事件及其它做出响应。有些JavaFX类定义了事件处理器特性,这些特性提供了注册事件处理器的方法。把事件处理器特性配置到用户定义的处理器,以便注册处理器来接收处理相应的事件类型。为事件处理器属性提供的Setter方法是一种便利的事件处理器注册方式。1.2.1使用便利方法许多便利的方法在Node类中定义了,且对其所有子类都可用。其它的类也有便利的方法。表2-1描述了能用于处理事件的便利方法以及识别哪个类中定义了便利方法。表2-1有便利方法的事件处理器类用户行为事件类型类键盘按键KeyEventNode、Scene鼠标移动或按键MouseEventNode、Scene以交替方式输入字符,或生成、改变、删除或提交InputMethodEventNode、Scene拖动对象DragEventNode、Scene滚动对象ScrollEventNode、Scene按按钮或选中菜单项ActionEventButtonBase,COntextMenuMenuItem,TextField编辑清单、表或树的项ListView.EditEvent;TableColumn.EditEventTreeView.EditEventListView;TableColumnTreeView播放器出错MediaErrorEventMediaView菜单展示或隐藏EventMenu弹出窗口隐藏EventPopupWindowTab选中或关闭EventTab窗口关闭、展示或隐藏WindowEventWindow注册事件处理器的便利方法格式如下:setOnEvent-type(EventHandler?superevent-classvalue)其中,Event-type是事件处理器处理的事件类型,如setOnKeyTyped的KEY_TYPED事件,或setOnMouseClicked的MOUSE_CLICKED的事件;event_class是定义事件类型的类,如KeyEvent是与键盘输入相关事件,MouseEvent是鼠标输入相关事件;?Superevent-class标明event-class或作为参数的超类事件处理器的接收事件处理器的方法。例如InputEvent的处理器即可用于鼠标事件也可用于键盘事件。下面语句展示了这种注册时间处理器处理按键时产生的事件的方法的定义,即按键或释放时:setOnKeyTyped(EventHandler?superKeyEventvalue)通过定义匿名处理器类来调用这种便利方法一步创建或注册事件处理器。事件处理器必须实现handle()方法,并提供相应的处理事件的代码。便利方法应用示例如代码所示,代码用NetbeansIDE创建JavaFX应用产生。创建应用时,如果选择“创建应用类(CreateApplicationClass)”选项,创建的主类包含一个“HelloWorld”应用。生成的代码如示例2-1所示。示例2-1HelloWorld例子packageyourapplication;importjavafx.application.Application;importjavafx.event.ActionEvent;importjavafx.event.EventHandler;importjavafx.scene.Group;importjavafx.scene.Scene;importjavafx.scene.control.Button;importjavafx.stage.Stage;publicclassYourApplicationextendsApplication{/***@paramargsthecommandlinearguments*/publicstaticvoidmain(String[]args){Application.launch(args);}@Overridepublicvoidstart(StageprimaryStage){primaryStage.setTitle(HelloWorld);Grouproot=newGroup();Scenescene=newScene(root,300,250);Buttonbtn=new
本文标题:JavaFX2专题教程-之-事件处理
链接地址:https://www.777doc.com/doc-4610564 .html