1

我有过滤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()功能,也许可以用这种方式解决取消选中的问题。

这是我的内容提供者:

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;
    }

}

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

4

1 回答 1

1

看起来您的getChildren方法每次调用时都会为给定的父元素返回新对象。

在这种情况下,equals您创建的新对象的方法必须true在给定表示相同值的前一个对象时返回。该hashCode方法还必须返回相同的哈希值。

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

于 2014-09-03T12:07:31.637 回答