Я пытаюсь проверить следующее из текстового поля: 1. Оно не пустое (имеет значение) 2. Является ли число (не каким-либо другим символом) 3. Имеет определенный min и max (диапазон)
Для этого я использую пустой валидатор, регулярное выражение и валидатор, соответственно, и объединяю их.Однако кажется, что он использует только последний валидатор в списке и игнорирует остальные.
Вот код:
private final Spinner<Integer> createSpinner(ValueRange range, int initialValue){
int min = (int) range.getMinimum();
int max = (int) range.getMaximum();
//TODO add validation in here
Spinner<Integer> spinner = new Spinner<Integer>();
spinner.setPrefSize(30, 30);
spinner.getStyleClass().add(Spinner.STYLE_CLASS_SPLIT_ARROWS_VERTICAL);
spinner.setEditable(true);
SpinnerValueFactory.IntegerSpinnerValueFactory valueFactory = new SpinnerValueFactory.IntegerSpinnerValueFactory(min, max, initialValue);
valueFactory.setConverter(new TimeIntegerStringConverter());
valueFactory.setWrapAround(true);
spinner.setValueFactory(valueFactory);
//validation
TextField editor = spinner.getEditor();
validationSupport.registerValidator(editor, false, Validator.<String>combine(
Validator.createEmptyValidator("Field cannot be empty",Severity.WARNING),
checkInRangeValidator(range),
checkIntegerValidator()
));
return spinner;
}
private static Validator<String> checkInRangeValidator(ValueRange range) {
String message = String.format("Input value must be between [%d,%d]", (int) range.getMinimum(), (int) range.getMaximum());
return Validator.<String>createPredicateValidator(
s -> range.isValidIntValue(Integer.valueOf(s)),
message,
Severity.ERROR
);
}
private static Validator<String> checkIntegerValidator(){
String message = "Input must be a number";
return Validator.createRegexValidator(message, "\\d+", Severity.ERROR);
}
Я не уверен, почему валидаторы не объединяются.Если я добавлю их отдельно в функции объединения, каждый валидатор будет работать.Но вместе они этого не делают.