2014-09-03 3 views
1

CheckboxTreeViewer에 필터가 있고 트리 뷰어에 필터를 적용하기 전에 항목을 선택했습니다. 내 필터가 텍스트 상자에서 작업 중이고 쓰는 동안 ModifyListener 기능을 사용 중입니다.CheckboxTreeViewer가 통화 새로 고침 후 선택 항목을 선택 취소했습니다.

필터가 완벽하게 작동하지만 필터를 적용한 후에 이전 항목이 선택 취소됩니다. 아마도 상황은 LabelProvider 또는 ContentProvider입니다.

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

} 

결론적으로, 나는 내 문제를 해결할 수없는 나는 당신의 도움이 필요합니다

여기 내 컨텐트 프로입니다.

+0

콘텐츠 공급자 코드를 확인해야한다고 생각합니다. –

+0

@ greg-449 콘텐츠 공급자 코드 – cgrgcn

답변

1

getChildren 메서드는 지정된 부모 요소가 호출 될 때마다 새 개체를 반환합니다. 이 같은 값을 나타내는 이전 객체를 주어 졌을 때이 경우

는 새 개체의 equals 방법은 당신이 해야에게 반환 true을 만들 수 있습니다. hashCode 메서드는 동일한 해시 값을 반환해야합니다.

때때로 이러한 방법을 변경하는 것이 문제가 될 수 있습니다. 이 경우 IElementComparer 클래스를 작성하여 트리에 대해 equalshashCode 특수 메소드를 제공 할 수 있습니다. 뷰어 setComparer 메서드를 호출하여 트리에 대한 비교자를 설정합니다.

+0

을 추가했습니다.이 메서드는 어떻게 구현해야합니까? 'ContentProvider' 클래스에는'equals'와'hashCode' 메소드가 있고 treeViewer에는 Comparer을 설정하는 동안'IElementComparer'가 있습니다. – cgrgcn

+0

'getChildren'과'getElements'에서 반환 한 클래스에서 그것들을 구현합니다.'SecondClass'는 당신이해야 할 모습입니다. 대답에 IElementComparer에 뭔가를 추가했습니다. –