【问题标题】:How to combine multiple ControlsFX validators for a text field?如何为文本字段组合多个 ControlsFX 验证器?
【发布时间】:2018-10-17 15:45:46
【问题描述】:

我正在尝试从文本字段中验证以下内容: 1.不为空(有值) 2. 是数字(不是其他字符) 3. 有一定的最小值和最大值(范围)

为此,我分别使用空验证器、正则表达式验证器和谓词验证器并将它们组合起来。然而,它似乎只使用了列表中的最后一个验证器,而忽略了其他验证器。

代码如下:

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);

    }

我不确定为什么验证器没有合并。如果我在组合函数中分别添加它们,每个验证器都可以工作。但它们一起不会。

【问题讨论】:

    标签: validation javafx controlsfx


    【解决方案1】:
    validationSupport.registerValidator(editor, false, Validator.<String>combine(
                    emptyValidator,
                    twoDigitValidator,
                    new RangeValidator(range)
                    ));
    
    
    private final Validator<String> emptyValidator = (control,value) ->
                 ValidationResult.fromErrorIf(control, "Value cannot be empty", StringExtended.isEmptyOrNullOrWhitespace(value));
    
    
        private final Validator<String> twoDigitValidator = (control,value) -> {
                return ValidationResult.fromErrorIf(control, "Value must consist of 2 digits", !value.matches("\\d{2}"));
    
        };
    
        private class RangeValidator implements Validator<String>{
    
            private ValueRange range;
    
            RangeValidator(ValueRange range){
                this.range = range;
            }
    
            @Override
            public ValidationResult apply(Control control, String value) {
                String message = String.format("Input value must be between [%d,%d]", (int) range.getMinimum(), (int) range.getMaximum());
                return ValidationResult.fromErrorIf(control, message,  !range.isValidIntValue(Integer.valueOf(value)));
            }
    
        }
    

    【讨论】:

    • 当在微调器上使用增量器/减量器时,验证似乎不起作用。叹息。
    猜你喜欢
    • 2011-02-16
    • 1970-01-01
    • 2017-01-08
    • 2012-03-25
    • 2014-04-10
    • 2023-03-25
    • 2021-10-29
    相关资源
    最近更新 更多