首页 > 解决方案 > TextField 限制长度和字母

问题描述

我尝试限制我的 javafx TextField 的字母和最大长度。我以前做过很多次,我总是使用相同的方法,但这次我出错了。

这是我的代码:

nameTextField.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(final ObservableValue<? extends String> ov, final String oldValue, final String newValue) {
            if (nameTextField.getText().length() > 30) {
                String s = nameTextField.getText().substring(0, 30);
                nameTextField.setText(s);
            }
            if (!newValue.matches("\\sa-zA-Z")) {
                nameTextField.setText(newValue.replaceAll("[^\\sa-zA-Z]", ""));
            }
        }
    });

当我只对 maxlength 使用限制时,它可以正常工作,而当我只对字母类型使用限制时,它也可以正常工作。但是,当我在一个字段上同时使用这两个限制时,它就不能正常工作。

字母类型的限制工作正确,但是当我尝试输入超过 30 个字母时,我有“线程中的异常”JavaFX 应用程序线程“java.lang.StackOverflowError”

在这条线上

nameTextField.setText(newValue.replaceAll("[^\\sa-zA-Z]", ""));

标签: javajavafx

解决方案


您的正则表达式匹配函数存在问题。

它总是进入第二个if并用新字符串替换字符串,即使它超出了限制。

因此,它将文本设置为超出限制的字符,然后再次发出更改事件,依此类推……这就是 stackoverflow 异常的原因。

你应该把这个

 if (!newValue.matches("[a-zA-Z]+")) 

对于最佳实践,您可以使用else if而不是 second if

因为这两个条件是不可能实现的。


推荐阅读