事件過濾器允許我們在事件捕獲階段處理事件。
節(jié)點可以具有用于處理事件的一個或多個過濾器。
我們可以為多個節(jié)點使用一個過濾器來處理多個事件類型。
來自父節(jié)點的事件過濾器負責(zé)處理其子節(jié)點,并可攔截事件并防止子節(jié)點對事件執(zhí)行操作。
事件過濾器是EventHandler接口的實現(xiàn)。要注冊過濾器,請使用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(); } }
上面的代碼生成以下結(jié)果。
以下代碼定義了過濾器對象,并將其用于不同的事件過濾器。
// 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; /* ww w .ja v a 2s . 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"); // 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(); } }
上面的代碼生成以下結(jié)果。
要刪除事件過濾器,請使用removeEventFilter()方法。此方法將事件類型和過濾器作為參數(shù)。
以下代碼刪除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(); } }
上面的代碼生成以下結(jié)果。
更多建議: