2012-06-25 47 views
3

我想在我的RCP應用程序中構建一個視圖,該視圖只包含一個TreeViewerJFace與TreeViewer的數據綁定

樹可以包含文件夾或葉子,文件夾可以包含文件夾和葉子。當我將文件夾添加到根文件夾的後端數據模型時,UI會自動更新,但是如果我將文件夾添加到任何分支文件夾,UI將不會自動更新。請告訴我我的代碼有什麼問題。

模型類:

public class TreeNode extends BindableObject { 

    private Folder parent; 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     super.firePropertyChange("name", this.name, this.name = name); 
    } 

    public Folder getParent() { 
     return parent; 
    } 

    public void setParent(Folder parent) { 
     this.parent = parent; 
    } 

} 
public class Folder extends TreeNode { 

    private List<TreeNode> children = new ArrayList<TreeNode>(); 

    public List<TreeNode> getChildren() { 
     return children; 
    } 

    public void setChildren(List<TreeNode> children) { 
     this.children = children; 
    } 

    public void add(TreeNode node){ 
     children.add(node); 
    } 

} 

視圖:

public class ExplorerView extends ViewPart { 

    private WritableList data; 
    private TreeViewer treeViewer; 

    public WritableList getData() { 
     return data; 
    } 

    public TreeViewer getViewer(){ 
     return treeViewer; 
    } 

    public ExplorerView() { 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void createPartControl(Composite parent) { 
     parent.setLayout(new FillLayout(SWT.HORIZONTAL)); 
     treeViewer = new TreeViewer(parent, SWT.BORDER); 
     treeViewer.setContentProvider(new ObservableListTreeContentProvider(new ExplorerObservableFactory(), new ExploerTreeStructureAdvisor())); 
     treeViewer.setLabelProvider(new ExplorerTreeLabelProvider()); 
     ArrayList<TreeNode> list = new ArrayList<TreeNode>(); 
     list.add(new ExplorerDataModel().getElements()[0]); 
     data = new WritableList(list, TreeNode.class); 
     treeViewer.setInput(data); 
    } 

    @Override 
    public void setFocus() { 

    } 

} 

的ObservableFactory:

public class ExplorerObservableFactory implements IObservableFactory { 

    @Override 
    public IObservable createObservable(Object target) { 
     System.out.println(target.getClass().getName()); 
     if(target instanceof WritableList){ 
      return (WritableList)target; 
     } 
     else if(target instanceof Folder){ 
      List<TreeNode> children = ((Folder)target).getChildren(); 
      return new WritableList(children, TreeNode.class); 
     } 
     return null; 
    } 

} 

的TreeStructureAdvisor:

public class ExploerTreeStructureAdvisor extends TreeStructureAdvisor { 

    @Override 
    public Object getParent(Object element) { 
     return ((TreeNode)element).getParent(); 
    } 

    @Override 
    public Boolean hasChildren(Object element) { 
     if(element instanceof Folder){ 
      return true; 
     }else{ 
      return false; 
     } 
    } 



} 

數據:

public class ExplorerDataModel { 
    public TreeNode[] getElements() { 
     Folder f1 = new Folder(); 
     f1.setName("Database Connections"); 
     Folder f11 = new Folder(); 
     f11.setName("Credit Test"); 
     TreeNode t1 = new TreeNode(); 
     t1.setName("[email protected]"); 
     f11.add(t1); 
     t1.setParent(f11); 
     TreeNode t2 = new TreeNode(); 
     t2.setName("[email protected]"); 
     f11.add(t2); 
     t2.setParent(f11); 
     Folder f12 = new Folder(); 
     f12.setName("Credit Product"); 
     TreeNode t3 = new TreeNode(); 
     t3.setName("[email protected]"); 
     f12.add(t3); 
     t3.setParent(f12); 
     TreeNode t4 = new TreeNode(); 
     t4.setName("[email protected]"); 
     f12.add(t4); 
     t4.setParent(f12); 
     f1.add(f11); 
     f11.setParent(f1); 
     f1.add(f12); 
     f12.setParent(f1); 
     return new TreeNode[] { f1 }; 
    } 
} 

測試命令處理程序:

public Object execute(ExecutionEvent event) throws ExecutionException { 
    ExplorerView v =(ExplorerView) HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().findView("com.amarsoft.dmp.explorer.explorerView"); 
     Folder f = new Folder(); 
     f.setName("ODA Flat Files"); 
     v.getData().add(f); 

     Folder f1 = (Folder) v.getData().get(0); 
     f1.setName("Database Connections (3)"); 

     Folder f2 = new Folder(); 
     f2.setName("Report Test"); 
     f1.add(f2); 

     return null; 
    } 

如果我執行上面的命令,添加文件夾「ODA平面文件」將立即出現在樹中,但添加文件夾「報告測試」不會在那裏,如果撥打TreeViewer#refresh()一切都好,但我想知道爲什麼。

回答

4

修改您的模型不會通知您的樹。刷新是告訴樹數據已經改變並且需要更新的一種方式。如果你在eclipse中瀏覽jface的瀏覽器,你會發現下面的報價

要處理結構變化,請改用refresh方法。

+1

數據綁定背後的想法是使JFace的模型和其他模型(在這個例子中的javabean)保持同步......我覺得你仍然需要調用方法刷新... – Matteo

1

在你ExplorerObservableFactory更換

... else if(target instanceof Folder){ 
      List<TreeNode> children = ((Folder)target).getChildren(); 
      return new WritableList(children, TreeNode.class); 
    } 

按照

 else if(target instanceof Folder){     
      return BeansObservables.observeList(target, "children"); 
    } 

如果返回WritableList這裏,ContentProvider的的偵聽器已註冊就可以了(應該註冊而不是數據庫bean)