DOC-07-02 使用快捷方法
本章介绍一些“便捷方法”,在JavaFX程序中你可以使用这些方法注册事件处理器(Event Handler)。学习使用更简单的方式创建和注册Event Handler来响应鼠标事件、键盘事件、动作(action)事件、拖拽事件、窗口事件等。
有一些JavaFX类中定义了Event Handler属性,它们可以用来注册Event Handler。给用户定义的Event Handler设置属性会自动注册可接收处理相应的事件类型的Event Handler。Event Handler属性的setter方法是注册Event Handler的快捷方法。
使用快捷方法
许多快捷方法都定义在Node类中,并且这些方法对Node的所有子类也都是可用的。除此之外还有有一些其它类也包含快捷方法。表2-1列出了这些快捷方法可以处理的事件并标识出这些方法是在哪些类中定义的。
表2-1 带有事件处理快捷方法的类
用户动作 | 事件类型 | 所在类 |
按下键盘上的按键 | KeyEvent | Node、Scene |
移动鼠标或者按下鼠标按键 | MouseEvent | Node、Scene |
执行完整的“按下-拖拽-释放”鼠标动作 | MouseDragEvent | Node、Scene |
在一个节点中,底层输入法提示其文本的改变。编辑中的文本被生成/改变/移除时,底层输入法会提交最终结果,或者改变插入符位置。 | InputMethodEvent | Node、Scene |
执行受所在平台支持的拖拽动作 | DragEvent | Node、Scene |
滚动某对象 | ScrollEvent | Node、Scene |
在某对象上执行旋转手势 | RotateEvent | Node、Scene |
在某对象上执行滑动手势 | SwipeEvent | Node、Scene |
触摸某对象 | TouchEvent | Node、Scene |
在某对象上执行缩放手势 | ZoomEvent | Node、Scene |
请求上下文菜单 | ContextMenuEvent | Node、Scene |
按下按钮、显示或隐藏组合框、选择菜单项 | ActionEvent | ButtonBase、ComboBoxBase、ContextMenu、MenuItem、TextField |
编辑列表、表格或者树的子项 | ListView.EditEvent
TableColumn.CellEditEvent TreeView.EditEvent |
ListView
TableColumn TreeView |
媒体播放器遇到错误 | MediaErrorEvent | MediaView |
菜单被显示或者隐藏 | Event | Menu |
弹出式窗口被隐藏 | Event | PopupWindow |
选项卡被选择或者关闭 | Event | Tab |
窗口被关闭、显示或者隐藏 | WindowEvent | Window |
注册事件处理器(Event Handler)的快捷方法都有如下格式:
1 |
setOnEvent-type(EventHandler<? super event-class> value) |
Event-type表示该Event Handler处理的事件类型,例如,setOnKeyTyped表示处理KEY_TYPED事件、setOnMouseClicked表示处理MOUSE_CLICKED事件。event-class表示事件类型的定义类,例如KeyEvent表示与键盘输入有关的事件、MouseEvent表示与鼠标输入有关的事件。字符串<? super event-class>表示该方法接收一个处理event-class类型或其父类型事件的处理器作为参数。例如,当事件是鼠标事件或者键盘事件时都可以使用InputEvent类型的Event Handler。
下面的语句展示了注册Event Handler的方法的定义,该Event Handler用于处理键盘输入时产生的事件,即按键被按下并被释放时产生的事件:
1 |
setOnKeyTyped(EventHandler<? super KeyEvent> value) |
你可以在对快捷方法的调用中把Event Handler定义为匿名类,这种方式可以一步到位地创建和注册事件处理器。Event Handler需要实现handle()方法来提供事件处理代码。
以下是一个使用快捷方法的样例,该样例代码是在NetBeans集成开发环境创建JavaFX应用程序时生成的。如果你在创建JavaFX应用程序使选择了“创建应用程序类”(Create Application Class)选项,创建出的主类就会包含一个“Hello World”程序。样例代码如例2-1所示。
例2-1 Hello World样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package yourapplication; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.stage.Stage; public class YourApplication extends Application { /** * @param args the command line arguments */ public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Hello World"); Group root = new Group(); Scene scene = new Scene(root, 300, 250); Button btn = new Button(); btn.setLayoutX(100); btn.setLayoutY(80); btn.setText("Hello World"); btn.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { System.out.println("Hello World"); } }); root.getChildren().add(btn); primaryStage.setScene(scene); primaryStage.show(); } } |
该程序创建了一个仅包含一个按钮的窗口。使用setOnAction()方法注册了一个事件处理器来处理按钮点击事件。事件处理器中的handle()方法通过在控制台打印“Hello World”字符串来处理该事件。
鼠标事件样例
为鼠标事件注册Event Handler的快捷方法包括setOnMouseEntered、setOnMouseExited和setOnMousePressed。例2-2展示了这些Event Handler的样例。
例2-2 鼠标事件的Event Handler样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
final Circle circle = new Circle(radius, Color.RED); circle.setOnMouseEntered(new EventHandler<MouseEvent>() { public void handle(MouseEvent me) { System.out.println("Mouse entered"); } }); circle.setOnMouseExited(new EventHandler<MouseEvent>() { public void handle(MouseEvent me) { System.out.println("Mouse exited"); } }); circle.setOnMousePressed(new EventHandler<MouseEvent>() { public void handle(MouseEvent me) { System.out.println("Mouse pressed"); } }); |
要了解类似的Event Handler是如何被使用的,请运行Ensemble样例程序。该样例程序可在Java SE下载页面的“JDK Demons and Samples”部分下载到。Ensemble样例程序同时也提供了Event Handler的源码。
键盘事件样例
为键盘事件注册Event Handler的快捷方法包括setOnKeyPressed和setOnKeyReleased。例2-3展示了这些事件处理器的样例。
例2-3 键盘事件的Event Handler样例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
final TextField textBox = new TextField(); textBox.setPromptText("Write here"); textBox.setOnKeyPressed(new EventHandler<KeyEvent>() { public void handle(KeyEvent ke) { System.out.println("Key Pressed: " + ke.getText()); } }); textBox.setOnKeyReleased(new EventHandler<KeyEvent>() { public void handle(KeyEvent ke) { System.out.println("Key Released: " + ke.getText()); } }); |
要了解类似的事件处理器是如何被使用的,请运行Ensemble样例程序。该样例程序可在Java SE下载页面的“JDK Demons and Samples”部分下载到。Ensemble样例程序同时也提供了事件处理器的源码。
附加资源
要了解更多关于快捷方法的信息,请参考JavaFX API文档。


from: DOC-07-01 处理事件 | JavaFX中文资料 – 中文文档、入门教程
from: DOC-07-05 使用可触摸设备的事件 | JavaFX中文资料 – 中文文档、入门教程