我对CheckboxTreeViewer
进行了过滤,在树形图上应用过滤器之前,我检查了一个项目。我的过滤器正在处理文本框并在编写时使用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;
}
}
作为结论,我无法解决我的问题,我需要你的帮助。
答案 0 :(得分:1)
看起来你的getChildren
方法在每次调用时返回给定父元素的新对象。
在这种情况下,当您获得表示相同值的前一个对象时,您创建的新对象的equals
方法必须返回true
。 hashCode
方法也必须返回相同的哈希值。
有时改变这些方法可能会有问题。在这种情况下,您可以创建一个IElementComparer
类,为树提供特殊的equals
和hashCode
方法。调用viewer setComparer
方法来设置树的比较器。