【问题标题】:ControlsFX complex validationControlsFX 复杂验证
【发布时间】:2016-01-28 08:25:19
【问题描述】:

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

validationSupport.registerValidator(passwordInput,
                  Validator.createEmptyValidator("Password required!"));
validationSupport.registerValidator(confirmPasswordInput,
                  new EqualsToValidator(passwordInput.textProperty(),
                                  "Password differs from confirmation"));

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

如果我更改 only 密码 EqualsToValidatornot 因为它正在监听 confirmPasswordInput 而不是 passwordInput

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

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

当另一个字段发生变化时如何使一个字段失效?

【问题讨论】:

  • 嗯,看来验证没那么复杂。我编写了自己的简单验证器。
  • 请将您的解决方案写在评论或回答部分,以便有相同问题的人有解决方案。
  • 您找到将它与 ValidationSupport 一起使用的方法了吗?

标签: validation javafx controlsfx


【解决方案1】:

My implementation

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

【讨论】:

    【解决方案2】:

    这对我有用。我只是复制了 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);
        }
    }
    

    您还需要将控件 Set 更改为 Map 以保留验证器。

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

    【讨论】:

      猜你喜欢
      • 2014-08-18
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      相关资源
      最近更新 更多