首页 文章

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

提问于
浏览
0

我有一个带有以下事件处理程序的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

    使用 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);
    

相关问题