JavaFX事件处理机制是一种用于处理用户界面交互的机制,它可以让开发者更好地控制应用程序的行为。JavaFX事件处理机制使用一种叫做“监听器”的技术来实现,这种技术允许开发者在特定的时间内监听特定的事件,并根据需要执行特定的动作。
JavaFX中的事件处理机制提供了一个标准化的方法来处理用户界面中出现的不同类型的事件。例如,当用户单击一个按钮时,JavaFX会自动调用相应的“action listener”方法来处理该单击事件。此外,JavaFX还允许开发者使用不同类型的监听器来监听不同类型的事件(例如键盘、鼠标、焦点、菜单、文字输入等)。
// 创建一个Button对象 Button btn = new Button("Click Me!"); // 注册ActionListener btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Button Clicked!"); } });
事件过滤器允许我们在事件捕获阶段处理事件。
节点可以具有用于处理事件的一个或多个过滤器。
我们可以为多个节点使用一个过滤器来处理多个事件类型。
来自父节点的事件过滤器负责处理其子节点,并可拦截事件并防止子节点对事件执行操作。
事件过滤器是EventHandler接口的实现。要注册过滤器,请使用addEventFilter()方法。
// Register an event filter for a single node and a specific event type scene.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { public void handle(MouseEvent e) { System.out.println("mouse clicked"); }; });
完整的源代码
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.MouseEvent; import javafx.stage.Stage; //from w ww . ja va 2 s . c o m 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"); // Register an event filter for a single node and a specific event type scene.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { public void handle(MouseEvent e) { System.out.println("mouse clicked"); }; }); root.getChildren().add(textBox); primaryStage.setScene(scene); primaryStage.show(); } }
上面的代码生成以下结果。
以下代码定义了过滤器对象,并将其用于不同的事件过滤器。
// Define an event filter EventHandler filter = new EventHandler<InputEvent>() { public void handle(InputEvent event) { System.out.println("Filtering out event " + event.getEventType()); event.consume(); } }; // Register the same filter for two different nodes scene.addEventFilter(MouseEvent.MOUSE_PRESSED, filter); // Register the filter for another event type scene.addEventFilter(KeyEvent.KEY_PRESSED, filter);
完整的源代码
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.InputEvent; import javafx.scene.input.KeyEvent; 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); TextField textBox = new TextField(); textBox.setPromptText("Write here"); // Define an event filter EventHandler filter = new EventHandler<InputEvent>() { public void handle(InputEvent event) { System.out.println("Filtering out event " + event.getEventType()); event.consume(); } }; // Register the same filter for two different nodes scene.addEventFilter(MouseEvent.MOUSE_PRESSED, filter); // Register the filter for another event type scene.addEventFilter(KeyEvent.KEY_PRESSED, filter); root.getChildren().add(textBox); primaryStage.setScene(scene); primaryStage.show(); } }
上面的代码生成以下结果。
要删除事件过滤器,请使用removeEventFilter()方法。此方法将事件类型和过滤器作为参数。
以下代码删除MouseEvent.MOUSEPRESSED事件的过滤器。
// Remove an event filter myNode1.removeEventFilter(MouseEvent.MOUSE_PRESSED, filter);
完整的源代码
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.InputEvent; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; import javafx.stage.Stage; // ww w. ja v a 2 s.co m 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"); // Define an event filter EventHandler filter = new EventHandler<InputEvent>() { public void handle(InputEvent event) { System.out.println("Filtering out event " + event.getEventType()); event.consume(); } }; // Register the same filter for two different nodes scene.addEventFilter(MouseEvent.MOUSE_PRESSED, filter); // Register the filter for another event type scene.addEventFilter(KeyEvent.KEY_PRESSED, filter); scene.removeEventFilter(MouseEvent.MOUSE_PRESSED, filter); root.getChildren().add(textBox); primaryStage.setScene(scene); primaryStage.show(); } }
上面的代码生成以下结果。
Java 实例 - 将文件内容复制到另一个文件 Java 实例以下实例演示了使用 BufferedWriter 类的 read 和 write 方法将文件内容复制...
Java 实例 - 文件路径比较 Java 实例以下实例演示了使用 File 类的 filename.compareTo (another filename) 方法来比较两个文件...
Java 实例 - 递归创建目录 Java 实例以下实例演示了使用 File 类的 mkdirs() 实现递归创建目录 :import java.io.File;public cl...
Java 实例 - 遍历目录 Java 实例以下实例演示了使用 File 类的 dir.isDirectory() 和 dir.list() 方法来遍历目录:import java.i...
Java 实例 - 文件重命名 Java 实例以下实例演示了使用 File 类的 oldName.renameTo(newName)方法来重命名文件:import java.io.F...