CheckboxTreeViewer在调用refresh()后取消选中我的选择

时间:2014-09-03 09:04:19

标签: java swt eclipse-rcp jface treeviewer

我对CheckboxTreeViewer进行了过滤,在树形图上应用过滤器之前,我检查了一个项目。我的过滤器正在处理文本框并在编写时使用ModifyListener函数。

text.addModifyListener(new ModifyListener() {
    public void modifyText(ModifyEvent e) {
        refreshFilter();
    }
});

private void refreshFilter() {
    myFilter.setFilter(text.getText());
    checkboxTreeViewer.refresh();
}

过滤器工作正常,但在应用过滤器后,我的旧选择将变为未选中状态。情况可能是LabelProviderContentProvider

我试图打电话给checkboxTreeViewer.refresh(false);没有用。

此外,我通过刷新了解崩溃问题。建议是实施IElementComparer并覆盖equals()hashCode()函数,并且可以通过这种方式解决问题。

这是我的ContentProvider:

private class MyTreeContentProvider implements ITreeContentProvider {

    @Override
    public void dispose() {

    }

    @Override
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

    }

    @Override
    public Object[] getElements(Object inputElement) {
        return ((List) inputElement).toArray(new Object[0]);
    }

    @Override
    public Object[] getChildren(Object parentElement) {
        if(parentElement instanceof FirstClass) {
            FirstClass is = (FirstClass)parentElement;
            return dbc.runJob(Util.byId(is.getId()).joinPrsl(true).joinIsltm(true)).getList().toArray(new SecondClass[0]);
        } else
            return new Object[0];
    }

    @Override
    public Object getParent(Object element) {
        return null;
    }

    @Override
    public boolean hasChildren(Object element) {            
        if(element instanceof SecondClass)
            return false;
        else
            return true;
    }

}

作为结论,我无法解决我的问题,我需要你的帮助。

1 个答案:

答案 0 :(得分:1)

看起来你的getChildren方法在每次调用时返回给定父元素的新对象。

在这种情况下,当您获得表示相同值的前一个对象时,您创建的新对象的equals方法必须返回truehashCode方法也必须返回相同的哈希值。

有时改变这些方法可能会有问题。在这种情况下,您可以创建一个IElementComparer类,为树提供特殊的equalshashCode方法。调用viewer setComparer方法来设置树的比较器。