Включение кнопки при вводе текста

114
15 января 2022, 05:40

Задача собственно такая: Имеется основное поле ввода TextField surnameNamePatronymicID - принимает ФИО, имеется кнопка Button fillButtonAction - именуемая "заполнить" При нажатии на кнопку "заполнить" парсится введенное (разбивается по пробелам) и в массив, далее из массива в нужные поля, далее из этих полей в нужные TextField.

this.fullName = textField.getText();
String[] fullNameArr = this.fullName.split("\\s");
this.surname = fullNameArr[0];
this.name = fullNameArr[1];
this.patronymic = fullNameArr[2];

Собственно вопрос в чем, нужна некая защита от "дурака", корректный ввод. Сейчас реализовал так, если поле TextField surnameNamePatronymicID пустое, то кнопка "заполнить" не активна.

...
@FXML
    private TextField surnameNamePatronymicID;
@FXML
    private Button fillButtonAction;
    public void initialize() {
        fillButtonAction.disableProperty().bind(surnameNamePatronymicID.textProperty().isEmpty());
    }
@FXML
    private void fillButtonAction() throws IOException {
...

Но хочется чтобы было такая проверка, к примеру: текст " " текст " " текст и только после этого кнопка становится активной, т.е. ввели Иванов Иван Иванович и кнопка стала активной.

Знаний в Java не так много, прошу сделать на это скидку.

Так же если есть другие варианты проверки правильности ввода - приветствуются! Спасибо.

Другими словами, как заставить пользователя ввести корректно ФИО?

Answer 1

Вы можете поставить слушатель на ваш TextField

surnameNamePatronymicID.setOnKeyReleased(new EventHandler<KeyEvent>() {
            @Override
            public void handle(KeyEvent event) {
                try{String s = surnameNamePatronymicID.getText();
                    if(s.length()>5){ 
                        // Не менее 5 символов
                        fillButtonAction.setDisable(false);
                        return;
                    }
                    fillButtonAction.setDisable(true);
                }
                catch (Exception e){
                    fillButtonAction.setDisable(true);
                }
            }
        });

Всю эту богодельню, конечно лучше поместить в отдельный класс/метод, и вызвать с помощью лямбды. Метод должен принимать ссылки на TextField и ваш button

    surnameNamePatronymicID.setOnKeyReleased(event -> YourClass.method(surnameNamePatronymicID,fillButtonAction)); 
//Пример вызова метода ( альтернатива варианту выше )

Надеюсь вы справитесь с тем что нужно написать в методе другого класса.

Отмечу так же, что лучше использовать setOnKeyReleased, так вы гарантированно получите последний нажатый символ.

Answer 2

Поставить слушатель на изменение текста TextField.

surnameNamePatronymicID.textProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            if(newValue.length()<5) {
                // good
            }else {
                // bad
            }
        }
    });

Этот обработчик вызывается при любом изменение текста. Например если пользователь захочет сделать копи-паст это все равно будет работать.

READ ALSO
Присваивание значения переменной - Scanner несколько раз

Присваивание значения переменной - Scanner несколько раз

Есть сканер Int чиселС помощью try catch обрабатываю ошибку того, что это не число типа Int, но при вводе чего-то другого, кроме целого числа выдается...

113
Не выполняется Handler

Не выполняется Handler

Подскажите пожалуйста, почему код выполняется только один раз и всё:

92
Ошибка при возвращении в методе Java

Ошибка при возвращении в методе Java

Ошибка в return getDistEclipse хочет объявление отдельного класса для getDist

89