2014-03-19 2 views
1

내보기에는 표준 Ecore 편집기의 EMF 모델을 수신하고 추가 작업을 수행하는 트리 뷰어가 있습니다. 선택한 요소가 트리 뷰어가 입력으로 필요로하는 유형인지 여부를 확인하는 선택 리스너를 이미 등록했습니다. 따라서 문제는 모델에 변경 사항이있는 경우 (예 : 새 요소 또는 새 정보를 기존 요소에 추가하는 경우) 트리 뷰어는 사용자가 선택 항목을 변경 한 경우에만 변경된 모델을 표시합니다 (즉, 모든 모델 요소에 대한 클릭 등).기본 모델이 변경된 후 JFace TreeViewer 업데이트

하지만 내가해야할 일은 기본 모델이 변경되고 모델을 클릭해도 모델을 클릭하지 않아도 트리 뷰어에 직접 알림이 전송된다는 것입니다.

나는 이클립스 코너 기사 (https://www.eclipse.org/articles/Article-TreeViewer/TreeViewerArticle.htm#inputChanged)를 발견했으며 "응답 th change"에서 inputChanged() 및 refresh() 메소드가 내가 찾고있는 해결책이 아닌 것 같습니까?

여전히 모델 코드를 변경하지 않고도이 작업을 수행하는 더 쉬운 방법이 UI 코드를 변경해야만하는지 궁금합니다. 감사!

답변

4

TreeViewerrefresh() 메서드를 호출하여 모델의 전체 트리를 새로 고치거나 refresh(Object) 트리를 업데이트하여 지정된 모델 개체에서 트리를 새로 고칠 수 있습니다.

트리 구조가 변경되지 않은 경우 update(Object)을 호출하면 단일 개체의 표시를 업데이트 할 수 있습니다.

또한 모델 트리에서 개체를 추가 및 제거 할 때 addremove 메서드가 있습니다.

일부 방법에는 Object [] 변형이 있으므로 일부 개체를 한 번에 수정할 수 있습니다.

업데이트 :

귀하의 모델은 콘텐츠 제공자를들을 수있는 모델 변경 이벤트의 생성을 지원해야한다. 이 수신기를 콘텐츠 공급자 inputChanged 메서드에서 설정하고 dispose 메서드에서 제거합니다. 모델 변경 이벤트가 수신되면 다양한 TreeViewer 메소드를 사용하여 트리를 업데이트하십시오.

이 모든 것이 사용되는 방법의 예는 작업 영역 (예 : 네비게이터보기)에 파일을 표시하는 Eclipse보기입니다. 이들을위한 컨텐트 프로 바이더는 작업 공간 리소스 변경 리스너 (IResourceChangeListener)를 사용하여 작업 공간에 대한 변경 사항을 통지하고 이벤트 정보를 사용하여 위에 나열된 메소드를 호출하여 트리를 업데이트합니다.

업데이트 2 : 콘텐츠 제공 업체에 IResourceChangeListener를 사용 예, org.eclipse.ui.views.tasklist.TaskListContentProvider

class TaskListContentProvider 
     implements IStructuredContentProvider, IResourceChangeListener 
{ 
    private TableViewer viewer; 

    private IResource input; 

    ... other methods .... 

    public void dispose() { 
    if (input != null) { 
     input.getWorkspace().removeResourceChangeListener(this); 
     input = null; 
    } 
    } 


    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 
    if (input != null) { 
     input.getWorkspace().removeResourceChangeListener(this); 
    } 

    input = (IResource) newInput; 

    if (input != null) { 
     input.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE); 
    } 

    viewer = (TableViewer) viewer; 
    } 

    public void resourceChanged(IResourceChangeEvent event) { 

    ... use resource change event to update viewer 
    } 
} 
+0

에서 추출한 예, 나는이 방법과 그 기능을 알고있다. 이미 여러 번 사용하고 있습니다. 그러나 여기에있는 질문은 내 트리 뷰어가 선택 리스너와 같은 모델을 명시 적으로 듣지 않고 기본 모델 변경을 인식하는 방법입니다. 그래서 새로 고침 메서드 등을 호출 할 수 있습니까? 아마도 모델에 리스너를 등록해야하고 내 모델은 inputChanged() 메서드를 올바르게 구현해야하지만 정확히 어떻게 그리고 어느 모델을 구현해야합니까? 아니면 모델 코드를 변경하지 않고 더 좋은 방법이 있습니까? – DanglingElse

+0

기존 사용 예제와 모델 수신기를 추가 할 위치를 추가했습니다. –

+0

업데이트 해 주셔서 감사합니다.하지만 여전히 어떤 문제가 있는지 알고 있습니다.inputChanged()의 사용법과 IResourceChangeListener를 등록하는 것에 대해 약간의 코드 스 니펫을 제공해 주시겠습니까? 고마워요! – DanglingElse