ControlsFX复杂验证

4
我需要验证一个简单的JavaFX表单,包含密码和确认密码。
validationSupport.registerValidator(passwordInput,
                  Validator.createEmptyValidator("Password required!"));
validationSupport.registerValidator(confirmPasswordInput,
                  new EqualsToValidator(passwordInput.textProperty(),
                                  "Password differs from confirmation"));

在EqualsToValidator中,我只需比较property.getValue()和传递给验证器的value。

如果我只改变密码,仅密码EqualsToValidator不会被调用,因为它正在监听confirmPasswordInput而不是passwordInput。

我只找到了丑陋的解决方案:

passwordInput.textProperty().addListener((observable, oldValue, newValue) -> {
    String oldText = confirmPasswordInput.getText();
    confirmPasswordInput.setText(null);
    confirmPasswordInput.setText(oldText);
});

如何在另一个字段更改时使一个字段失效?


好的,看起来验证并不那么复杂。我编写了自己的简单验证器。 - Denis Kokorin
1
请在评论或答案部分编写您的解决方案,以便遇到相同问题的人能够获得解决方案。 - Maxoudela
你找到了一种使用ValidationSupport的方法吗? - dinhokz
2个回答

1

我的实现

Validator.java - 验证器的基类。

TextValidator.java 和 PasswordValidator.java - 实现类。

ValidationSupport.java 跟踪所有验证器。

用法:

validationSupport.addValidator(new TextValidator(usernameInput, "Username is required!"));
validationSupport.addValidator(new TextValidator(passwordInput, "Password is required!"));
validationSupport.addValidator(new PasswordValidator(passwordInput, confirmPasswordInput, "Password differs from confirmation"));

-1
这个对我有用。我只是复制了ValidationSupport类并添加了以下代码。
@SuppressWarnings("unchecked")
public <T> void reaplyValidator(Control target){

    if(!controls.containsKey(target)){
        throw new NullPointerException("The given control was not registered");
    }

    ValueExtractor.getObservableValueExtractor(target).map( e -> {

        ObservableValue<T> observable = (ObservableValue<T>) e.call(target);
        Validator<T> validator = (Validator<T>) controls.get(target);

        Platform.runLater(() -> validationResults.put(target, validator.apply(target, observable.getValue())));

        dataChanged.set(true);

        return e;

    });
}

public void revalidate(){
    for(Control c : getRegisteredControls()){
        reaplyValidator(c);
    }
}

你还需要将控件集更改为地图,以保留验证器。

private ObservableMap<Control, Validator<?>> controls = FXCollections.observableMap(new HashMap<>());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接