2014-01-18 4 views
1

TreeViewer으로 RCP 응용 프로그램을 개발 중입니다. 뷰어에 편집 지원을 추가하는 방법 (모델에서 뷰의 변경 내용이 어떻게 업데이트되는지)을 설명 할 수있는 기사는 많지만, 언더 레이 모델이 변경되면 Treeview를 업데이트하는 데별로 도움이되지 않습니다. 짧은 내 질문 :모델이 변경되면 Eclipse JFace Treeviewer가 업데이트됩니까?

트 리뷰 ----> 모델 그 갱신이 예

많이있다 ------

모델 ----> 트 리뷰 그 갱신은 -----이 내 질문

입니다

편집 : 이것이 내가 시도한 것으로 작동합니다. 코멘트 데이터 모델이 content provider에 의해 제공됩니다

viewer.getTree().addKeyListener(new KeyListener(){ 

    @Override 
    public void keyPressed(KeyEvent e) { 

    } 

    @Override 
    public void keyReleased(KeyEvent e) { 

     if(e.keyCode==SWT.F3){ 
      System.out.println("F3 pressed... new element will be added"); 
      TreeParent root = (TreeParent) viewer.getInput(); 
      TreeParent activityRoot = (TreeParent) root.getChildren()[0]; 
      activityRoot.addChild(new TreeObject("NEW_ACTIVITY")); 
      //viewer.update(root, null); 
      viewer.refresh(); 
     } 

    } 

    }); 

답변

3

만족, TreeViewer이 데이터를 변경하는 수단을 제공하지 않습니다 - 당신이해야 할 그것을 자신의 코드가. 당신이 모델을 변경 한 경우에는 변경에 대한 TreeViewer에게 다음과 같은 방법을 사용할 수 있습니다

그냥 사용하는 트리에서 하나의 항목에 대한 표시에 필요한 사항을 변경 한 경우

TreeViewer.update(object, null); 

트리의 해당 항목을 업데이트합니다. 여러 객체를 업데이트하기위한 배열 버전이 있습니다. 트리에서

추가하거나 제거한 경우 객체는

TreeViewer.refresh(); 

object에서 트리의 시작 부분을 새로 고치려면 전체 트리 또는

TreeViewer.refresh(object); 

을 다시 사용합니다.

다음의

TreeViewer.add(parent, object); 
TreeViewer.remove(object); 

도있다 배열 변이가있는 개체를 추가 및 제거에 대한 트리를 이야기합니다.

는 TreeViewer는 객체 ( TreeViewer.setInput 전에 호출해야 함)
TreeViewer.setUseHashlookup(true); 

전화를 찾을 수 있도록합니다. 이 작업은 해시 테이블을 사용하므로 객체는 hashCodeequals 메서드를 사용해야합니다. TreeViewer.setComparer을 사용하여 다른 클래스를 지정하여 해시 코드 및 비교를 수행 할 수도 있습니다.

+0

나는 나무의 삭제 시도 : 그리고 분명히 TreeParent 클래스는

public void fireChildDelete(final TreeObject obj){ if(this.listener!=null){ new Runnable(){ @Override public void run() { System.out.println("New thread spawned with ID "+Thread.currentThread().getId()); listener.onDelete(obj); } }.run(); } } 

위 # 1에 사용되는 청취자의 ArrayList 마지막으로 다음과 같이 키를 삭제 처리 할 TreeViewer 객체에 KeyListener를 추가해야 항목은 다음을 사용하지만 작동하지 않습니다. 코드에 문제가 있습니까? : if (e.keyCode == SWT.DEL) { System.out.println ("DEL 키를 눌렀습니다 ... 요소가 삭제됩니다"); \t \t \t \t \t TreeItem item = ((Tree) e.getSource()). getSelection() [0]; viewer.remove (item.getData()); \t \t \t \t \t viewer.update (viewer.getInput(), null); viewer.refresh(); } – ssdimmanuel

+1

'viewer.remove (object)'만으로 충분할 것입니다. 뷰를 사용하여 객체를 찾는 데 도움이되도록 생성하는 동안'TreeViewer.setUseHashlookup (true)'를 많이 호출해야합니다. –

+0

TreeViewer.setUseHashlookup (true)이 작동하지 않습니다. – ssdimmanuel

0

TreeViewer을 사용하는 이클립스 코너 기사 중 하나 인이 스레드의 주석을 기반으로 작동하는 모델을 만들었습니다.

트리 컨텐츠 공급자가 각 트리 모델 항목에 리스너를 추가하고 아래

public class TreeContentProvider implements IStructuredContentProvider,ITreeContentProvider,TreeModelListener { 

TreeViewer tv; 
public TreeContentProvider(TreeViewer tv){ 
    this.tv=tv; 
} 

int cnt=0; 
public void inputChanged(Viewer v, Object oldInput, Object newInput) { 
    cnt ++; 
    System.out.println("inputChanged() called "+oldInput+" new: "+newInput); 
    if(newInput!=null){ 

     ((TreeParent)newInput).setListener(this); 
     TreeObject []items = ((TreeParent)newInput).getChildren(); 
     for(TreeObject obj : items){ 
      if(obj instanceof TreeParent){ 
       ((TreeParent) obj).setListener(this); 
      } 
     } 

    } 
} 

.... 

@Override 
public void onDelete(TreeObject obj) { 
    System.out.println("Delete of "+obj+" handled by content handler "); 
    TreeParent parent = obj.getParent(); 
    if(parent.getChildren().length<=1){ 
     return; 
    } 
    parent.removeChild(obj); 
    this.tv.refresh(); 
} 
같은이 인터페이스를 구현하자 다음

public interface TreeModelListener extends EventListener { 
    public void onDelete(TreeObject obj); 
} 

같은 리스너 인터페이스를 만들기 : 여기

는 단계입니다

}

방법 추가 o TreeModel 클래스는 다음과 같습니다.

tv.getTree().addKeyListener(new KeyListener(){ 

     @Override 
     public void keyPressed(KeyEvent e) { 

     } 

     @Override 
     public void keyReleased(KeyEvent e) { 

      if(e.keyCode==SWT.F3){ 
       System.out.println("F3 pressed... new element will be added"); 
       TreeParent root = (TreeParent) tv.getInput(); 
       TreeParent activityRoot = (TreeParent) root.getChildren()[0]; 
       activityRoot.addChild(new TreeObject("NEW_ACTIVITY")); 
       //viewer.update(root, null); 
       tv.refresh(); 
      } 

      if(e.keyCode==SWT.DEL){ 


       System.out.println("DEL key pressed... element will be deleted "+((Tree)e.getSource()).getSelection().length); 

       if(((Tree)e.getSource()).getSelection().length>0){ 
        final IStructuredSelection selection = (IStructuredSelection) tv 
           .getSelection(); 
        System.out.println("DEL#2 key pressed... element will be deleted "+selection.getFirstElement().getClass()); 

        TreeParent parent = ((TreeObject)selection.getFirstElement()).getParent(); 
        parent.fireChildDelete((TreeObject) selection.getFirstElement()); 
        //tv.remove(selection.getFirstElement()); 
        //viewer.update(viewer.getInput(),null); 
        //tv.refresh(); 
       } 
      } 


     } 

    }); 
관련 문제