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的内容。