EventFilter consume()不会阻止TextField

时间:2016-10-12 18:36:48

标签: javafx-8

我有一个JavaFX GUI,我希望拦截按下SpaceBar并使用它来调用方法。我写了一个似乎可以解决问题的EventFilter。它包含命令 event.consume(),我认为它应该使 KeyEvent 不会传播到各种控件。

我的问题是,当我添加 TextField ,并且此字段具有焦点时,空格键按下的内容并没有像我想的那样被消耗。 “”由TextField捕获。我想拦截并阻止将“”添加到TextField。

为了防止“”到达TextField,我在下面的代码中省略了什么? api,如果我正确读取它,说用父控件注册的过滤器可以在事件到达子节点之前拦截它。但即使将过滤器直接放在TextField上,我仍然会在TextField中出现“”字符。

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.KeyCode;

import javafx.scene.input.KeyEvent;

import javafx.stage.Stage;


public class SpaceIntercept extends Application implements EventHandler <KeyEvent>
{
    public static void main(String[] args) 
    {   
        Application.launch(args);
    }

    @Override
    public void start(Stage primaryStage) 
    {
        TextField textField = new TextField("asdf");
        Group root = new Group();
        Scene scene = new Scene(root, 200, 100);
        scene.addEventFilter(KeyEvent.ANY, event -> handle(event));        
        // root.addEventFilter(KeyEvent.ANY, event -> handle(event));
        // textField.addEventFilter(KeyEvent.ANY, event -> handle(event)); 
        root.getChildren().add(textField); 
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    @Override
    public void handle(KeyEvent event) 
    {
        if (event.getCode() == KeyCode.SPACE)
        {
            if (event.getEventType() == KeyEvent.KEY_PRESSED)
            {
                System.out.println("Code that responds to SpaceBar");
            }
            event.consume();
        }
    }       
}

2 个答案:

答案 0 :(得分:3)

文本字段可能正在侦听KEY_TYPED个事件。与well-documented一样,getCode()会为KeyCode.UNDEFINED事件返回KEY_TYPED。因此,你不会遇到这种情况。

您可以检查character变量以及code变量来处理所有情况:

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.KeyCode;

import javafx.scene.input.KeyEvent;

import javafx.stage.Stage;


public class SpaceIntercept extends Application implements EventHandler <KeyEvent>
{
    public static void main(String[] args) 
    {   
        Application.launch(args);
    }

    @Override
    public void start(Stage primaryStage) 
    {
        TextField textField = new TextField("asdf");
        Group root = new Group();
        Scene scene = new Scene(root, 200, 100);
        scene.addEventFilter(KeyEvent.ANY, event -> handle(event));        
        // root.addEventFilter(KeyEvent.ANY, event -> handle(event));
        // textField.addEventFilter(KeyEvent.ANY, event -> handle(event)); 
        root.getChildren().add(textField); 
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    @Override
    public void handle(KeyEvent event) 
    {
        if (event.getCode() == KeyCode.SPACE  || " ".equals(event.getCharacter()))
        {
            if (event.getEventType() == KeyEvent.KEY_PRESSED)
            {
                System.out.println("Code that responds to SpaceBar");
            }
            event.consume();
        }
    }       
}

答案 1 :(得分:1)

我可以想到一个简单的解决方案,虽然它不会阻止空间被添加到TextField,但是在添加changeListener后几乎立即添加它就会替换它到TextProperty的{​​{1}}:

TextField

这也可能有用http://fxexperience.com/2012/02/restricting-input-on-a-textfield/