JavaFX addEventFilter事件过滤器

事件过滤器提供了处理由键盘操作、鼠标操作、滚动操作和更多事件源生成的事件的方法。

事件过滤器在事件处理的事件捕获阶段处理事件。事件过滤器需要向节点注册,以便为节点上生成的事件提供事件处理逻辑。但是,JavaFX 使我们能够为多个节点和多个事件类型注册单个事件过滤器。

Event Filter 提供了 EventHandler 接口的实现。接口的 handle() 方法提供了在生成事件时将执行的代码。

向节点添加事件过滤器

要为节点注册事件过滤器,可以使用addEventFilter()方法。此方法有两个参数,第一个参数是生成的事件的类型,第二个参数是过滤器,它将具有处理事件的代码。

添加事件过滤器的语法如下:

node.addEventFilter (<Event_Type>, new EventHandler<Event-Type>(){   
public void handle(Event-Type){   
//Actual logic   
});   

可以为多个事件类型定义一个事件过滤器。

addEventFilter事件过滤器的例子

package com.yiidian;

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 JavaFX_EventFilter extends Application {
  
    @Override  
    public void start(Stage primaryStage) throws Exception {
        //Adding Labels and TextFileds to the scene
        Label l1 = new Label("Press Any Key ");
        Label l2 = new Label("Filtering Event ");  
          
        l1.setTranslateX(100);  
        l1.setTranslateY(100);  
          
        l2.setTranslateX(100);  
        l2.setTranslateY(150);  
          
        TextField tf1 = new TextField();
        TextField tf2 = new TextField();  
          
        tf1.setTranslateX(250);  
        tf1.setTranslateY(100);  
        tf2.setTranslateX(250);  
        tf2.setTranslateY(150);  
          
          
        //Creating EventHandler Object   
        EventHandler<KeyEvent> filter = new EventHandler<KeyEvent>() {
            @Override  
            public void handle(KeyEvent event) {  
                tf2.setText("Event : "+event.getEventType());
                tf1.setText(event.getText());  
                event.consume();  
            }  
        };  
          
        //Registering Event Filter for the event generated on text field   
        tf1.addEventFilter(KeyEvent.ANY,filter );
          
        //Setting Group and Scene   
        Group root = new Group();
        root.getChildren().addAll(l1,l2,tf1,tf2);  
        Scene scene = new Scene(root,500,300, Color.WHEAT);
        primaryStage.setScene(scene);  
        primaryStage.setTitle("一点教程网:Adding Event Filter");
        primaryStage.show();  
    }  
    public static void main(String[] args) {  
        launch(args);  
    }  
  
}  

输出结果为:

删除事件过滤器

当我们不再需要事件过滤器来处理为特定节点生成的事件来处理事件时,我们可以使用removeEventFilter()方法移除过滤器。

方法中传递了两个参数,第一个是事件类型,第二个是过滤器,它是 EventHandler 类对象。

使用以下语法删除向节点注册的事件过滤器。

node.removeEventFilter(<Input-Event>, filter);  

其中,filter 是 EventHandler 类的对象

热门文章

优秀文章