JavaFX: Как обработать выделение текста в textField с помощью обработчика событий? - PullRequest
0 голосов
/ 08 декабря 2018

У меня есть текстовое поле javaFX со следующим обработчиком событий:

public static EventHandler<KeyEvent> numericValidation(final Integer maxLengh) {
    return new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent e) {
            TextField txt_TextField = (TextField) e.getSource();

            if (txt_TextField.getText().length() >= max_Lengh) {
                e.consume();
            }
            if(!e.getCharacter().matches("[0-9]")){
                e.consume();
            }
        }
    };
}
...
yearTextField.addEventFilter(KeyEvent.KEY_TYPED , numeric_Validation(4));

Это должно гарантировать, что текстовое поле может принимать только цифры с максимум maxLength цифрами.Проблема в том, что теперь, если я выберу часть текста из текстового поля (несколько цифр) и попытаюсь написать другие цифры, он ничего не сделает.Я хочу, чтобы выбранный текст был заменен тем, что я пишу, так же, как это происходит с базовыми текстовыми полями, если он состоит из цифр и не превышает длину maxLength.Как мне этого добиться?

1 Ответ

0 голосов
/ 08 декабря 2018

Используйте TextFormatter, созданный с использованием UnaryOperator в качестве параметра конструктора.Это UnaryOperator получает объект, содержащий, помимо прочего, новый текст, который будет получен в результате ввода.Вы можете вернуть измененное изменение, влияющее на результат, или просто вернуть null для ввода, чтобы не изменять TextField.

. Используя этот подход, ваш код также работает, если вы копируете и вставляете несколько цифр в TextField...

Пример:

int maxLength = 8;
final String matchString = "\\d{0," + maxLength + "}"; // allow 0 to maxLength digits

TextField textField = new TextField();
TextFormatter<?> formatter = new TextFormatter<>(change -> {
    String newText = change.getControlNewText();
    return newText.matches(matchString) ? change : null;
});
textField.setTextFormatter(formatter);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...