首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ControlsFX复合验证

ControlsFX复合验证
EN

Stack Overflow用户
提问于 2015-10-28 14:03:14
回答 2查看 1.3K关注 0票数 4

我需要用密码和密码确认来验证简单的JavaFX表单。

代码语言:javascript
复制
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

我只找到了丑陋的解决办法:

代码语言:javascript
复制
passwordInput.textProperty().addListener((observable, oldValue, newValue) -> {
    String oldText = confirmPasswordInput.getText();
    confirmPasswordInput.setText(null);
    confirmPasswordInput.setText(oldText);
});

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-04 04:46:54

我的实施

Validator.java -验证器的基类。

TextValidator.java和PasswordValidator.java -实现。

ValidationSupport.java跟踪所有验证器。

用法:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2017-03-28 15:55:25

这对我有用。我只是复制了ValidationSupport类并添加了折叠代码。

代码语言:javascript
复制
@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);
    }
}

您还需要将控件设置为Map,以便保持验证器。

代码语言:javascript
复制
private ObservableMap<Control, Validator<?>> controls = FXCollections.observableMap(new HashMap<>());
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33393159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档