Java CheckboxTreeViewer在调用刷新()后取消选中我的选择

Java CheckboxTreeViewer在调用刷新()后取消选中我的选择,java,swt,eclipse-rcp,jface,treeviewer,Java,Swt,Eclipse Rcp,Jface,Treeviewer,我在我的CheckboxTreeViewer上安装了过滤器,在将过滤器应用于treeviewer之前,我检查了一个项目。我的过滤器在文本框上工作,并在编写时使用ModifyListener函数 text.addModifyListener(new ModifyListener() { public void modifyText(ModifyEvent e) { refreshFilter(); } }); private void refreshFilter(

我在我的
CheckboxTreeViewer上安装了过滤器,在将过滤器应用于treeviewer之前,我检查了一个项目。我的过滤器在文本框上工作,并在编写时使用
ModifyListener
函数

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

private void refreshFilter() {
    myFilter.setFilter(text.getText());
    checkboxTreeViewer.refresh();
}
过滤器工作正常,但在应用过滤器后,我的旧选择将被取消选中。可能情况是关于
LabelProvider
ContentProvider

我试图调用
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;
    }

}

总之,我无法解决我的问题,我需要您的帮助。

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

在这种情况下,创建的新对象的
equals
方法必须返回
true
,前提是它被赋予代表相同值的前一个对象。
hashCode
方法还必须返回相同的哈希值


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

我想我们需要查看您的内容提供程序代码。@greg-449我添加了我的内容提供程序代码我应该如何在何处实现这些方法?在
ContentProvider
类中有
equals
hashCode
方法,在为treeViewer设置比较器时也有
IElementComparer
方法。您可以在从
getChildren
返回的类中实现它们,并且
getElements
-从它的外观来看
SecondClass
就是您需要的方法需要做的事。在答案中添加了一些关于IElementComparer的内容。