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()); // вывод значения при изменении
});
}
}