将IValidator添加到ListBinding以进行JFace数据绑定

时间:2018-02-02 12:06:06

标签: java jface

班级ValueBinding有两个UpdateValueStrategy(目标是模型和模型到目标),它们都有一个转换器和三个验证器(" get","在转换"和"之后设置")。

ListBinding及其UpdateListStrategy s没有任何类型,只有一个转换器(而且我不确定这个东西是否打开)。我希望实现与UpdateValueStrategy验证器类似的功能,以验证列表中是否至少有一个元素。

我尝试了什么(以及我如何失败):

  • 覆盖ListBinding.doUpdate(...) - 它是私人的
  • ListBinding.validationStatusObservable添加更改侦听器并在设置后进行验证 - 我无法判断更新是否为模型 - >目标或目标 - >模型,所以我不知道应该验证哪个列表

有效的是创建针对新WritableValue的第二个绑定并为其添加验证器。但这并不是最佳选择。我宁愿拥有一个在验证失败时不会更新的绑定。

我确定某人之前必须遇到同样的问题,因此问题是:如何向IValidator添加ListBinding

1 个答案:

答案 0 :(得分:0)

所以我做了我自己的UpdateListStrategy(带着二十一点和......没关系):

public class BetterUpdateListStrategy extends UpdateListStrategy {

    @Override
    protected IStatus doAdd(IObservableList observableList, Object element, int index) {
        IStatus result = super.doAdd(observableList, element, index);
        if (result.isOK()) {
            result = validate(observableList);
        }
        return result;
    }

    // these methods are overridden in exactly the same way: 
    // protected IStatus doMove(IObservableList observableList, int oldIndex, int newIndex)
    // protected IStatus doRemove(IObservableList observableList, int index) 
    // protected IStatus doReplace(IObservableList observableList, int index, Object element) 

    private IStatus validate(IObservableList value) {
        // my validation; I added an IValidator to have a similar API
        // to the UpdateValueStrategy
        return Status.OK_STATUS;
    }
}

它尚未完美运行(如果验证失败,绑定没有错误状态),但这可能有助于其他人。