📜  JavaFX 事件过滤器

📅  最后修改于: 2020-10-15 00:34:14             🧑  作者: Mango

事件过滤器

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

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

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

将事件过滤器添加到节点

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

下面给出了添加事件过滤器的语法。

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

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

以下示例说明了将事件过滤器用于节点的工作。

package application;
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 {
// TODO Auto-generated method stub

//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 filter = new EventHandler() {
@Override
public void handle(KeyEvent event) {
// TODO Auto-generated method stub
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(, filter);

其中,filter是EventHandler类的对象。