JavaFX事件過濾器

2018-01-09 19:24 更新

JavaFX教程 - JavaFX事件過濾器


事件過濾器允許我們在事件捕獲階段處理事件。

節(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é)果。

null


過濾器對象

以下代碼定義了過濾器對象,并將其用于不同的事件過濾器。

// 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é)果。

null


刪除事件過濾器

要刪除事件過濾器,請使用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é)果。

null
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號