2 使用便利方法
本主题描述了您可以在JavaFX应用程序中使用的便利方法来注册事件处理程序。学习一种简单的方法来创建和注册事件处理程序,以响应鼠标事件、键盘事件、动作事件、拖放事件、窗口事件和其他事件。
一些JavaFX类定义了事件处理程序属性,这些属性提供了一种注册事件处理程序的方式。将事件处理程序属性设置为用户定义的事件处理程序会自动注册处理程序以接收相应的事件类型。事件处理程序属性的setter方法是用于注册事件处理程序的便利方法。
使用便利方法
许多便利方法在Node类中定义,并可用于其所有子类。其他类也包含便利方法。表2-1描述了可以使用便利方法处理的事件,并标识了定义便利方法的类。
表2-1 便捷方法用于事件处理的类
| 用户操作 | 事件类型 | 类 |
|---|---|---|
|
键盘上按下了键。 |
|
|
|
鼠标移动或鼠标上的按钮被按下。 |
|
|
|
执行完整的鼠标按下-拖动-释放操作。 |
|
|
|
生成、更改、删除或提交使用其他方法输入字符(通常用于外语)的输入。 |
|
|
|
执行平台支持的拖放操作。 |
|
|
|
对象被滚动。 |
|
|
|
在对象上执行旋转手势 |
|
|
|
在对象上执行滑动手势 |
|
|
|
对象被触摸 |
|
|
|
在对象上执行缩放手势 |
|
|
|
请求上下文菜单 |
|
|
|
按钮被按下,组合框显示或隐藏,或者菜单项被选中。 |
|
|
|
列表、表格或树中的项目被编辑。 |
|
|
|
媒体播放器遇到错误。 |
|
|
|
菜单显示或隐藏。 |
|
|
|
弹出窗口隐藏。 |
|
|
|
选中或关闭选项卡。 |
|
|
|
窗口关闭、显示或隐藏。 |
|
|
注册事件处理程序的便利方法具有以下格式:
setOn事件类型(EventHandler<? super 事件类> value)
事件类型是处理程序处理的事件类型,例如,setOnKeyTyped用于处理KEY_TYPED事件,或者setOnMouseClicked用于处理MOUSE_CLICKED事件。 事件类是定义事件类型的类,例如,与键盘输入相关的事件使用KeyEvent,与鼠标输入相关的事件使用MouseEvent。字符串<? super 事件类>表示该方法接受一个事件类的事件处理程序或其超类的事件处理程序作为参数。例如,当事件既是键盘事件又是鼠标事件时,可以使用InputEvent的事件处理程序。
下面的语句显示了注册事件处理程序的方法定义,用于处理键入键时生成的事件,即按下并释放键:
setOnKeyTyped(EventHandler<? super KeyEvent> value)
您可以通过在调用便利方法时将处理程序定义为匿名类来一步创建和注册事件处理程序。事件处理程序必须实现handle()方法,以提供处理事件所需的代码。
使用便利方法的示例在使用NetBeans IDE创建JavaFX应用程序时生成的代码中显示。如果在创建JavaFX应用程序时选择了创建应用程序类选项,则生成的主类包含一个“Hello World”应用程序。生成的代码显示在示例2-1中。
示例2-1 Hello World示例
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();
}
}
"Hello World"代码创建了一个带有一个按钮的窗口。使用setOnAction()方法注册一个事件处理程序,用于处理按钮被点击时分派的动作事件。事件处理程序中的handle()方法通过将字符串"Hello World"打印到控制台来处理事件。
鼠标事件示例
用于注册鼠标事件处理程序的便捷方法包括setOnMouseEntered、setOnMouseExited和setOnMousePressed。示例2-2显示了这些事件处理程序的示例。
示例2-2 鼠标事件的示例事件处理程序
final Circle circle = new Circle(radius, Color.RED);
circle.setOnMouseEntered(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
System.out.println("鼠标进入");
}
});
circle.setOnMouseExited(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
System.out.println("鼠标退出");
}
});
circle.setOnMousePressed(new EventHandler<MouseEvent>() {
public void handle(MouseEvent me) {
System.out.println("鼠标按下");
}
});
要了解如何使用类似的事件处理程序,请运行Ensemble示例,该示例可以从Java SE下载页面的JDK演示和示例部分下载。Ensemble示例还提供了事件处理程序的源代码。
键盘事件示例
用于注册键盘事件处理程序的便捷方法包括setOnKeyPressed和setOnKeyReleased。示例2-3显示了这些事件处理程序的示例。
示例2-3 键盘事件的示例事件处理程序
final TextField textBox = new TextField();
textBox.setPromptText("在这里写");
textBox.setOnKeyPressed(new EventHandler<KeyEvent>() {
public void handle(KeyEvent ke) {
System.out.println("按下键盘: " + ke.getText());
}
});
textBox.setOnKeyReleased(new EventHandler<KeyEvent>() {
public void handle(KeyEvent ke) {
System.out.println("释放键盘: " + ke.getText());
}
});
要了解如何使用类似的事件处理程序,请运行Ensemble示例,该示例可以从Java SE下载页面的JDK演示和示例部分下载。Ensemble示例还提供了事件处理程序的源代码。

