Я хочу ограничить количество символов, которое допускает контроль 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
в "" с campoTexto.setText("");
. То же самое происходит, если я пробую удалять единственный символ контроля и не знаю почему.
Ошибка происходит, потому что, когда набивается символ не позволенный будучи длиной TextField
0 в заявлении Matcher
пробует распределять substring (-1). С другой стороны, когда распределяется текст "" в TextField
вызывается автоматическая перенизина Listener, которая вновь находит ту же ошибку начала. Решение состоит в том, чтобы не применяться Pattern
если не добавилось ничто в 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) {
if (valorActual.length() > valorAnterior.length()) {
Pattern permitido = Pattern.compile("[A-Za-zÑÇÁÉÍÓÚÀÈÌÒÙÏÜÂÊÎÔÛñçáéíóúàèìòùïüâêîôû]");
Matcher mpermitido = permitido.matcher(valorActual.substring(valorAnterior.length()));
if (!mpermitido.find()) {
// caracter no permitido, borrarlo
campoTexto.setText(valorAnterior);
return;
}
if (campoTexto.getText().length() > tamañoMáximo) {
campoTexto.setText(campoTexto.getText().substring(0, tamañoMáximo));
}
}
}
});
}
Для которого он предпочел использовать lengthProperty
:
public static void fijarTamañoMáximo(final TextField campoTexto, final int tamañoMáximo) {
campoTexto.lengthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable,
Number valorAnterior, Number valorActual) {
if (valorActual.intValue() > valorAnterior.intValue()) {
Pattern permitido = Pattern.compile("[A-Za-zÑÇÁÉÍÓÚÀÈÌÒÙÏÜÂÊÎÔÛñçáéíóúàèìòùïüâêîôû]");
Matcher mpermitido = permitido.matcher(campoTexto.getText().substring(valorAnterior.intValue()));
if (!mpermitido.find()) {
// caracter no permitido, borrarlo
campoTexto.setText(campoTexto.getText().substring(0, valorAnterior.intValue()));
return;
}
// Revisa que la longitud del texto no sea mayor a la variable definida.
if (campoTexto.getText().length() >= tamañoMáximo) {
campoTexto.setText(campoTexto.getText().substring(0, tamañoMáximo));
}
}
}
});
}
Немножко более длинное но равное решение эффективной.
Используй: campoTexto.lengthProperty()
вместо:
campoTexto.textProperty()
и использует тот же listener, ChangeListener
, чтобы реализовывать ее validaciГіn количества разрешенных символов.
Пример:
public static void fijarTamanoMaximo(final TextField campoTexto, final int tamanoMaximo) {
campoTexto.lengthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable,
Number valorAnterior, Number valorActual) {
if (valorActual.intValue() > valorAnterior.intValue()) {
// Revisa que la longitud del texto no sea mayor a la variable definida.
if (campoTexto.getText().length() >= tamanoMaximo) {
campoTexto.setText(campoTexto.getText().substring(0, tamanoMaximo));
}
}
}
});
}
из этой формы мы можем санкционировать наше TextField
, CustomTextField
, и т.д., чтобы предотвращать, были введены в компьютер, больше некоего числа символов.
Проблема, которую я нашел в предыдущих ответах, - что, если carГЎcter незаконный он вмешивается сначала или посередине цепи тогда оно не функционирует и позволяет войти carГЎcter errГіneo. Чтобы это решать мы можем пробегать все символы новой цепи и подтверждать один в один, если он выполняет фильтр:
campoTexto.textProperty().addListener((final ObservableValue<? extends String> ov, final String valorAnterior, final String valorActual) -> {
if (valorActual.length() > valorAnterior.length()) {
Pattern permitido = Pattern.compile("[\\d]"); // filtro sólo números
Matcher mpermitido;
// recorremos la cadena buscando carácteres no deseados
for (int i = 0; i < valorActual.length(); i++) {
mpermitido = permitido.matcher(valorActual.substring(i, i + 1));
if (!mpermitido.find()) {
campoTexto.setText(valorAnterior);
return;
}
}
// controlamos la longitud máxima...
if (decimales.getText().length() > longitudMáxima) {
decimales.setText(decimales.getText().substring(0, longitudMáxima));
}
}
});