2014-09-03 14 views
1

我在我的CheckboxTreeViewer上有過濾器,並且在treeviewer上應用過濾器之前,我檢查了一個項目。我的過濾器正在處理文本框,並在編寫時使用ModifyListener函數。CheckboxTreeViewer在通話刷新後取消選中我的選擇()

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

} 

至於結論,我解決不了我的問題,我需要你的幫助。

+0

我認爲我們需要查看您的內容提供商代碼。 – 2014-09-03 09:20:45

+0

@ greg-449我添加了我的內容提供者代碼 – cgrgcn 2014-09-03 10:57:59

回答

1

它看起來像你的getChildren方法每次調用給定的父元素返回新的對象。

在這種情況下,新對象的equals方法創建必須回報true當它被賦予代表相同的值前一個對象。 hashCode方法也必須返回相同的散列值。

有時候改變這些方法可能會有問題。在這種情況下,您可以創建一個IElementComparer類來爲樹提供特殊的equalshashCode方法。調用查看器setComparer方法來設置樹的比較器。

+0

我應該如何實現這些方法?在ContentProvider類中有'equals'和'hashCode'方法,並且在設置treeViewer的Comparer時也有'IElementComparer'。 – cgrgcn 2014-09-03 12:17:18

+0

你可以在你從'getChildren'和'getElements'返回的類中實現它們 - 從它看起來'SecondClass'是你需要做的。在IElementComparer上添加了一些答案。 – 2014-09-03 12:24:57

相關問題