Javafx 简明教程

JavaFX - Event Filters

事件过滤器能够你在事件处理的事件捕获阶段处理事件。事件处理中的事件捕获阶段,是指事件遍历分派链中所有节点的一个阶段。此分派链中的一个节点既可以有一个或多个过滤器,又可以完全没有过滤器,来处理一个事件。

Event filters enable you to handle an event during the event capturing phase of event processing. Event Capturing phase in event handling is a phase where an event travels through all the nodes in a dispatch chain. A node in this dispatch chain can either have one or more filters, or no filters at all, to handle an event.

事件过滤器在事件捕获阶段处理事件,例如鼠标事件、滚动事件、键盘事件等。但是,这些事件过滤器需要在节点中注册,才能向节点上生成的事件提供事件处理逻辑。

Event Filters process the events, like mouse events, scroll events, keyboard events, etc. during this Event Capturing phase. However, these Event Filters need to be registered with the node in order to provide the event handling logic to the event generated on the node.

如果一个节点没有包含事件过滤器,则事件会直接传递到目标节点。否则,一个单一的过滤器可以用于多个节点和事件类型。简单总结来说,事件过滤器用于允许父节点为其子节点提供通用处理;以及截取事件并阻止子节点对事件做出反应。

If a node does not contain an event filter, the event is directly passed to the target node. Otherwise, a single filter can be used for more than one node and event types. To simply summarize, Event filters are used to enable the parent node to provide common processing for its child nodes; and also to intercept an event and prevent child nodes from acting on the event.

Adding and Removing Event Filter

要向节点添加事件过滤器,你需要使用 Node 类的 addEventFilter() 方法注册此过滤器。

To add an event filter to a node, you need to register this filter using the method addEventFilter() of the Node class.

//Creating the mouse event handler
EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() {
   @Override
   public void handle(MouseEvent e) {
      System.out.println("Hello World");
      circle.setFill(Color.DARKSLATEBLUE);
   }
};
//Adding event Filter
Circle.addEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);

通过如下所示的方式,你可以用 removeEventFilter() 方法删除过滤器:

In the same way, you can remove a filter using the method removeEventFilter() as shown below −

circle.removeEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);

Example

以下是演示了如何在 JavaFX 中使用事件筛选器处理事件的一个示例。将此代码保存在名为 EventFiltersExample.java 的文件中。

Following is an example demonstrating the event handling in JavaFX using the event filters. Save this code in a file with name EventFiltersExample.java.

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.event.EventHandler;

import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.input.MouseEvent;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;

import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class EventFiltersExample extends Application {
   @Override
   public void start(Stage stage) {
      //Drawing a Circle
      Circle circle = new Circle();

      //Setting the position of the circle
      circle.setCenterX(300.0f);
      circle.setCenterY(135.0f);

      //Setting the radius of the circle
      circle.setRadius(25.0f);

      //Setting the color of the circle
      circle.setFill(Color.BROWN);

      //Setting the stroke width of the circle
      circle.setStrokeWidth(20);

      //Setting the text
      Text text = new Text("Click on the circle to change its color");

      //Setting the font of the text
      text.setFont(Font.font(null, FontWeight.BOLD, 15));

      //Setting the color of the text
      text.setFill(Color.CRIMSON);

      //setting the position of the text
      text.setX(150);
      text.setY(50);

      //Creating the mouse event handler
      EventHandler<MouseEvent> eventHandler = new EventHandler<MouseEvent>() {
         @Override
         public void handle(MouseEvent e) {
            System.out.println("Hello World");
            circle.setFill(Color.DARKSLATEBLUE);
         }
      };
      //Registering the event filter
      circle.addEventFilter(MouseEvent.MOUSE_CLICKED, eventHandler);

      //Creating a Group object
      Group root = new Group(circle, text);

      //Creating a scene object
      Scene scene = new Scene(root, 600, 300);

      //Setting the fill color to the scene
      scene.setFill(Color.LAVENDER);

      //Setting title to the Stage
      stage.setTitle("Event Filters Example");

      //Adding scene to the stage
      stage.setScene(scene);

      //Displaying the contents of the stage
      stage.show();
   }
   public static void main(String args[]){
      launch(args);
   }
}

使用以下命令,从命令提示符编译并执行已保存的 java 文件。

Compile and execute the saved java file from the command prompt using the following commands.

javac --module-path %PATH_TO_FX% --add-modules javafx.controls EventFiltersExample.java
java --module-path %PATH_TO_FX% --add-modules javafx.controls EventFiltersExample

执行后,上述程序会生成如下所示的 JavaFX 窗口。

On executing, the above program generates a JavaFX window as shown below.

change color

Example

我们已经看到了如何使用事件筛选器处理鼠标事件。现在,让我们尝试将事件筛选器注册到键盘事件等其他事件中。将此代码保存在名为 EventFilterKeyboard.java 的文件中。

We have seen how event filters processing a mouse event. Now, let us try to register event filters on other events like Keyboard events. Save this code in a file with name EventFilterKeyboard.java.

import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyEvent;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class EventFilterKeyboard extends Application{
   @Override
   public void start(Stage primaryStage) throws Exception {
      //Adding Labels and TextFileds to the scene
      Label label1 = new Label("Insert Key");
      Label label2 = new Label("Event");

      label1.setTranslateX(100);
      label1.setTranslateY(100);

      label2.setTranslateX(100);
      label2.setTranslateY(150);

      TextField text1 = new TextField();
      TextField text2 = new TextField();

      text1.setTranslateX(250);
      text1.setTranslateY(100);
      text2.setTranslateX(250);
      text2.setTranslateY(150);

      //Creating EventHandler Object
      EventHandler<KeyEvent> filter = new EventHandler<KeyEvent>() {
         @Override
         public void handle(KeyEvent event) {
            text2.setText("Event : "+event.getEventType());
            text1.setText(event.getText());
            event.consume();
         }
      };

      //Registering Event Filter for the event generated on text field
      text1.addEventFilter(KeyEvent.ANY, filter);

      //Setting Group and Scene
      Group root = new Group();
      root.getChildren().addAll(label1,label2,text1,text2);
      Scene scene = new Scene(root, 500, 300);
      primaryStage.setScene(scene);
      primaryStage.setTitle("Adding Event Filter");
      primaryStage.show();
   }
   public static void main(String[] args) {
      launch(args);
   }
}

使用以下命令,从命令提示符编译并执行已保存的 java 文件。

Compile and execute the saved java file from the command prompt using the following commands.

javac --module-path %PATH_TO_FX% --add-modules javafx.controls EventFilterKeyboard.java
java --module-path %PATH_TO_FX% --add-modules javafx.controls EventFilterKeyboard

执行后,上述程序会生成如下所示的 JavaFX 窗口。

On executing, the above program generates a JavaFX window as shown below.

eventfilters keyboard