JFace数据绑定:仅在所有验证程序都成功时更新模型

时间:2014-02-05 12:17:20

标签: java validation data-binding swt jface

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:1)

一种可能性是创建一个Composite或Chained验证器并将所有验证器放入其中。然后,如果至少有一个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;
    }
}
}
}

然后使用相同的复合验证器绑定所有控件,但也添加控件特定的验证器。

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