【问题标题】:JFace Data Binding: Update model only if all validators succeedJFace 数据绑定:仅当所有验证器都成功时才更新模型
【发布时间】:2014-03-01 20:56:59
【问题描述】:

我正在使用 JFace 数据绑定。我有一个具有四个不同属性的 Java bean,它们都绑定到具有更新策略 POLICY_CONVERT 的相应小部件,因此只有当我点击“保存”按钮时模型才会更新。保存按钮的侦听器调用DataBindingContext.updateTargets(),因此更改会显示在其他地方。

某些属性具有验证器。现在,该应用程序的工作方式是,当我点击“保存”按钮时,无效属性不会更新到模型中,而有效属性会被更新。但我想做的是当且仅当所有验证器都成功时更新模型

有没有一种简单的方法可以用 JFace 做到这一点?我可以想象通过创建一个验证所有属性的验证器来做到这一点,但我希望有一些通用的解决方案。

谢谢!

【问题讨论】:

    标签: java validation data-binding swt jface


    【解决方案1】:

    一种可能性是创建一个复合或链式验证器并将所有验证器放入其中。然后,如果至少有一个 validaotr 验证失败,您的链式验证器将返回 false。

    例如:

    if (validators != null && validators.length > 0) {
    UpdateValueStrategy  update = new UpdateValueStrategy();
    CompositeValidator validator = new CompositeValidator();
    for (IValidator val2Add : validators) {
        validator.addValidator(val2Add);
    }
    update.setAfterConvertValidator(validator);
    }
    
    public class CompositeValidator implements IValidator {
    
    private List<IValidator> validators = new ArrayList<IValidator>();
    public IStatus validate(Object value) {
    for (IValidator validator : validators) {
        IStatus status = validator.validate(value);
        if (IStatus.ERROR == status.getSeverity()) {
            return status;
        }
    }
    }
    }
    

    然后将所有控件与相同的复合验证器绑定,但还要添加特定于控件的验证器。

    您还可以将控制权传递给验证器,如果发生错误,您可能希望在必要时显示此字段的错误控制装饰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2012-12-08
      • 2013-08-11
      • 1970-01-01
      相关资源
      最近更新 更多