JavaFX.Spinner. Проверка вводимых данных

Друзья, приветствую! Подскажите нормальную реализацию проверки введённых данных в spinner<Integer>? Пробую через установку конвертера spinner.getValueFactory().setConverter(...), но он работает только после инкремента/декремента значения - устанавливает "0" при вводе некорректных данных, детектируемых регулярным выражением. А если не нажимать инкремент/декремент, то подстановки нет, и в поле остаются некорректные данные, хотя, при этом фактическое значение - целочисленный "0", что и требуется.

Для того чтобы замена на "0" некорректных данных производилась визуально и фактически в значении поля при любых событиях окончания ввода, пробую сделать проверку и подстановку нуля при потере фокуса поля, а также, после нажатия клавиши Enter.

В текущей реализации используются некоторые попытки реализовать требуемые проверки, но вышеописанный результат пока только у конвертера:

    @FXML
    Spinner<Integer> spinner;

    // инициализация Spinner-контрола
    void initSpinner() { 
        Pattern p = Pattern.compile("^-?\\d+$"); // допустимы целые числа (в т.ч. отрицательные) 
        // параметры спиннера // min, max, initial, step
        spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(-255, 255, 0, 1));
            spinner.setEditable(true); // разрешён ввод пользовательских значений
            // проверка на введённое значение и конвертация
            spinner.getValueFactory().setConverter(
                    new StringConverter() { 
                        @Override
                        public String toString(Object obj) {
                            return (obj == null) ? "0" : obj.toString();
                        }
                        @Override
                        public Integer fromString(String s) {
                            if (s.matches(p.toString())) {
                                try {
                                    return Integer.valueOf(s);
                                }
                                catch (NumberFormatException e) {
                                    return 0;
                                }
                            }
                            return 0;
                        }
                    }
            );
            // вывод значения спиннера после инициализации
            System.out.println(spinner.getValue());

            // Дополнительные обработчики ввода
            // 1. Проверка по regexp (был вместо конвертера, не подставлял 0)
            spinner.valueProperty().addListener((observable, oldValue, newValue) -> {
                if (!p.matcher(newValue.toString()).matches())
                    spinner.getValueFactory().setValue(oldValue);
                System.out.println(spinner.getValue()); // вывод значения при изменении
            });
            // 2. Потеря фокуса
            spinner.focusedProperty().addListener((observable, oldValue, newValue) -> {
                if (newValue) {
                    spinner.increment(0); // won't change value, but will commit editor
                }
                System.out.println(spinner.getValue()); // вывод значения при изменении
            });
    }
}

Ответы (0 шт):