java - 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]", ""));
解决方案
您的正则表达式匹配函数存在问题。
它总是进入第二个if并用新字符串替换字符串,即使它超出了限制。
因此,它将文本设置为超出限制的字符,然后再次发出更改事件,依此类推……这就是 stackoverflow 异常的原因。
你应该把这个
if (!newValue.matches("[a-zA-Z]+"))
对于最佳实践,您可以使用else if而不是 second if
因为这两个条件是不可能实现的。
推荐阅读
- google-cloud-platform - 如何解决在 GCP 的 AI 平台上找不到文件(即使它存在)的问题?
- excel - 如何将多个工作表中的数据提取到动态列表中?
- amazon-web-services - 如何防止访问 Aws CloudFront 中的路径
- docker - NGINX 多个服务器块 - 502 Bad Gateway
- r - Stargazer:在桌子下面放几条线
- spring - 要求创建一个 jpa 存储库的 bean
- python - 根据条件在熊猫数据框行之间填充多行
- python - 为什么 [tag:weasyprint] xhtml-to-pdf 不适合 A4 页面?
- dns - 我应该如何使用路由器作为 DHCP 服务器来宣传运行 pi-hole 和 pivpn 的 pi 服务器的 DNS?
- if-statement - 有没有办法从最后一个条件 x 开始计算?