JavaFX:如何使用事件处理程序处理textField上的文本选择?

时间:2018-12-08 10:16:32

标签: java javafx

我有一个带有以下事件处理程序的javaFX文本字段:

public static EventHandler<KeyEvent> numericValidation(final Integer maxLengh) {
    return new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent e) {
            TextField txt_TextField = (TextField) e.getSource();

            if (txt_TextField.getText().length() >= max_Lengh) {
                e.consume();
            }
            if(!e.getCharacter().matches("[0-9]")){
                e.consume();
            }
        }
    };
}
...
yearTextField.addEventFilter(KeyEvent.KEY_TYPED , numeric_Validation(4));

这应该确保文本字段只能接受最多maxLength个数字的数字。问题是,现在如果我从文本字段中选择一些文本(一些数字),然后尝试写其他数字,它将无能为力。我希望将所选文本替换为我正在写的内容,就像它与基本文本字段一样,只要它是数字并且不会超过maxLength的长度即可。 我该如何实现?

1 个答案:

答案 0 :(得分:0)

使用使用TextFormatter创建的UnaryOperator作为构造函数参数。该UnaryOperator接收一个对象,该对象除其他信息外还包含输入所产生的新文本。您可以返回影响结果的修改后的更改,也可以只返回null作为输入,而不修改TextField

如果您将多个数字复制并粘贴到TextField ...

,则使用这种方法,您的代码也可以使用

示例:

int maxLength = 8;
final String matchString = "\\d{0," + maxLength + "}"; // allow 0 to maxLength digits

TextField textField = new TextField();
TextFormatter<?> formatter = new TextFormatter<>(change -> {
    String newText = change.getControlNewText();
    return newText.matches(matchString) ? change : null;
});
textField.setTextFormatter(formatter);