JavaFX事件监听是一种用于处理用户界面操作的机制,它可以让开发者在用户界面上添加响应操作。JavaFX事件监听器是一种特殊的对象,它可以监听特定的事件,并在发生时执行特定的代码。
JavaFX事件监听器有两个重要的部分:一个是事件源(Event Source),即可能会触发事件的对象;另一个是事件处理器(Event Handler),即当特定的事件被触发时所执行的代码。
要使用JavaFX中的事件监听机制,需要先创建一个新的EventHandler对象。EventHandler对象必须实现handle()方法来处理特定的事件。handle()方法接收一个EventObject作为入参,该对象包含有关该特定事件的信息。
EventHandler<ActionEvent> eventHandler = new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { // Do something when the button is clicked } };
然后将该eventHandler对象传递给setOnAction()方法来将其注册到Button上。当Button上发生action时就会执行handle()方法中声明的代码。
button.setOnAction(eventHandler);
点击按钮通常会触发事件。例如,点击我们打印对话框上的打印按钮以将文档打印到打印机。UI库使用事件来通知已发生的事情。
对于每个事件,都会有关于源和目标控件的信息。
JavaFX事件是javafx.event.Event类或其子类的一个实例。
JavaFX提供了几个事件,包括
您可以通过扩展 Event
类来定义自己的事件。
下表列出了事件的属性
属性 | 描述 |
---|---|
type | 发生的事件类型。 例如,鼠标事件。 |
Source | 事件的起源。 |
Target | 事件分派链中的最后一个节点。 |
事件类型是EventType类的一个实例。例如,KeyEvent类包含以下事件类型:
JavaFX事件传递过程包含以下步骤:
我们可以使用setOnXXX方法来注册事件处理程序,格式如下:
setOnEvent-type(EventHandler<? super event-class> value)
例如,
aButton.setOnAction(new EventHandler<ActionEvent>() { public void handle(ActionEvent event) { System.out.println("Hello World"); } });
事件类型
是处理程序处理的事件的类型,例如,键入类型事件的setOnKeyTyped或setOnMouseClicked用于鼠标点击事件。
event-class
是定义事件类型的类,例如,与键盘输入相关的事件的KeyEvent或与鼠标输入相关的事件的MouseEvent。
以下代码显示如何处理键按下和释放键时的键入事件:
setOnKeyTyped(EventHandler<? super KeyEvent> value)
下面的代码显示了如何处理按钮点击事件。setOnAction()方法用于注册事件处理程序。当用户单击按钮并打印时,将调用事件处理程序中的handle()方法“Hello World"到控制台。
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 Main extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage primaryStage) { Group root = new Group(); Scene scene = new Scene(root, 300, 250); Button btn = new Button(); 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(); } }
上面的代码生成以下结果。
setOnKeyPressed和setOnKeyReleased可以注册键事件处理程序。
import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.TextField; import javafx.scene.input.KeyEvent; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage primaryStage) { Group root = new Group(); Scene scene = new Scene(root, 300, 250); 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()); } }); root.getChildren().add(textBox); primaryStage.setScene(scene); primaryStage.show(); } }
上面的代码生成以下结果。
我们可以使用setOnMouseEntered,setOnMouseExited,和setOnMousePressed注册鼠标事件处理程序。
import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.input.MouseEvent; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage primaryStage) { Group root = new Group(); Scene scene = new Scene(root, 300, 250); Button btn = new Button(); btn.setText("Hello World"); btn.setOnMouseEntered(new EventHandler<MouseEvent>() { public void handle(MouseEvent me) { System.out.println("Mouse entered"); } }); btn.setOnMouseExited(new EventHandler<MouseEvent>() { public void handle(MouseEvent me) { System.out.println("Mouse exited"); } }); btn.setOnMousePressed(new EventHandler<MouseEvent>() { public void handle(MouseEvent me) { System.out.println("Mouse pressed"); } }); root.getChildren().add(btn); primaryStage.setScene(scene); primaryStage.show(); } }
上面的代码生成以下结果。
Java 实例 - 创建临时文件 Java 实例以下实例演示了使用 File 类的 createTempFile() 方法来创建临时文件:import java.io.*;pub...
Java 实例 - 修改文件最后的修改日期 Java 实例以下实例演示了使用 File 类的 fileToChange.lastModified() 和 fileToChange set...
Java 实例 - 删除目录 Java 实例以下实例演示了使用 File 类的 ofdir.isDirectory(), dir.list() 和 deleteDir() 方法在一个个删...
Java 实例 - 异常处理方法 Java 实例以下实例演示了使用 System 类的 System.err.println() 来展示异常的处理方法:class Except...
Java 实例 - 栈的实现 Java 实例以下实例演示了用户如何通过创建用于插入元素的自定义函数 push() 方法和用于弹出元素的 pop() ...