Ограничивать размер TextField в javaFX

Я хочу ограничить количество символов, которое допускает контроль 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("");. То же самое происходит, если я пробую удалять единственный символ контроля и не знаю почему.

1
задан 23.04.2016, 20:10
3 ответа

Ошибка происходит, потому что, когда набивается символ не позволенный будучи длиной 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));
                }                   
            }               
        }
    });
}

Немножко более длинное но равное решение эффективной.

-1
ответ дан 24.11.2019, 14:32

Используй: 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, и т.д., чтобы предотвращать, были введены в компьютер, больше некоего числа символов.

introducir la descripción de la imagen aquí

0
ответ дан 24.11.2019, 14:32
  • 1
    Спасибо за твой ответ. Правда - что менять м и # 233; каждый textProperty из-за lengthProperty ни в и # 241; ade он ничего не снимает. С твоим soluci и # 243; n я осуществил контроль того, что вмешивается из-за клавиатуры посредством Pattern, и вновь нахожусь точно та же ошибка, так как вышеупомянутая ошибка приходит спровоцированный точно этим implementaci и # 243; n. – Oundroni 25.04.2016, 10:07
  • 2
    Никто не сказал, что менять м и # 233; все textProperty из-за lengthProperty в и # 241; ade он ничего не снимает. Просто добавляет listener для тебя самих осуществлять validaci и # 243; n, когда происходит изменение в длине текста внутри TextField. – Jorgesys♦ 25.04.2016, 15:16
  • 3
    Не как долго используй Java, но это м и # 233; каждый м и # 225; s com и # 250; n для " Ограничивать tama и # 241; или TextField в javaFX". – Jorgesys♦ 25.04.2016, 15:17

Проблема, которую я нашел в предыдущих ответах, - что, если 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));
        }               
    }
});    
0
ответ дан 24.11.2019, 14:32