我想限制控件支持的字符数,TextField
我尝试过这种方法:
public static void fijarTamañoMáximo(final TextField campoTexto, final int tamañoMáximo) {
campoTexto.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(final ObservableValue<? extends String> ov, final String valorAnterior, final String valorActual) {
Pattern permitido = Pattern.compile("[A-Za-zÑÇÁÉÍÓÚÀÈÌÒÙÏÜÂÊÎÔÛñçáéíóúàèìòùïüâêîôû]");
Matcher mpermitido = permitido.matcher(valorActual.substring(valorActual.length() - 1));
if (mpermitido.find()) {
if (campoTexto.getText().length() > tamañoMáximo) {
String s = campoTexto.getText().substring(0, tamañoMáximo);
campoTexto.setText(s);
}
} else // caracter no permitido, borrarlo
if (valorActual.length() == 1) {
campoTexto.setText(""); // ¿Por qué sale error?
} else {
campoTexto.setText(valorAnterior);
}
}
});
}
fijarTamañoMáximo(miTextField, 10); // limito a 10 caracteres
我还将数据类型限制为字母字符。到这里一切正常(尽管我接受改进它的建议)。问题是,当第一个字符输入为不允许的字符时,例如数字,当我将TextField
a "" 的文本与campoTexto.setText("");
. 如果我尝试从控件中删除单个字符并且我不知道为什么,也会发生同样的事情。
用途:
campoTexto.lengthProperty()
代替 :
并使用相同的侦听
ChangeListener
器来验证允许的字符数。例子:
通过这种方式,我们可以验证我们的
TextField
,CustomTextField
等,以避免输入超过一定数量的字符。我在前面的答案中发现的问题是,如果在字符串的开头或中间输入了非法字符,则它不起作用并允许输入错误的字符。为了解决这个问题,我们可以遍历新字符串的所有字符,并一一检查它是否符合过滤器:
发生错误是因为在尝试分配子字符串 (-1)
TextField
的声明中键入了长度为 0的非法字符。Matcher
另一方面,当文本“”被分配给TextField
它时,它会导致侦听器的自动重新填充,该侦听器返回以从一开始就遇到相同的错误。解决方案是不应用Pattern
if nothing has been added toTextField
:对于那些喜欢使用的人
lengthProperty
:解决方案更长一点,但同样有效。