java - JFace数据绑定(bind): Update model only if all validators succeed

标签 java validation data-binding swt jface

我正在使用 JFace 数据绑定(bind)。我有一个具有四个不同属性的 Java bean,所有这些属性都绑定(bind)到相应的小部件,更新策略为 POLICY_CONVERT,因此仅当我点击“保存”按钮时模型才会更新。 “保存”按钮的监听器调用 DataBindingContext.updateTargets(),以便更改显示在其他位置。

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

是否有一种使用 JFace 执行此操作的简单方法?我可以想象通过创建一个验证所有属性的 validator 来以困难的方式做到这一点,但我希望有一些通用的解决方案。

谢谢!

最佳答案

一种可能性是创建一个复合或链式 validator 并将所有 validator 放入其中。然后,如果至少一个 validaotr 无法验证,您的链式 validator 将返回 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;
    }
}
}
}

然后将所有控件绑定(bind)到相同的复合 validator ,但同时添加特定于控件的 validator 。

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

关于java - JFace数据绑定(bind): Update model only if all validators succeed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21577061/

相关文章:

javascript - 如何编写 JavaScript 来验证多个表单的输入?

javascript - 在 Javascript 中验证 Java 包名称的正则表达式

c# - WPF - 如何将控件的位置绑定(bind)到当前鼠标位置?

wpf - 绑定(bind)到静态属性

python - Django form.is_valid 总是返回 true

java - 将命令对象从 SimpleFormController 传递到 Controller

java - 无法在 Intellij 中设置 Spring boot

java - 上午 11 点运行任务的 Cron 表达式在晚上 11 点完成

c# - 绑定(bind)数据更改时 Winforms 列表框不更新

java - java oracle 教程中带有锁对象的 Bow/Bower 示例