2012-05-22 34 views
3

我正在使用GraphViewer和SpaceTreeLayoutAlgorithm並嘗試在圖形創建後更新節點的標籤/圖標。更新zest中的節點的標籤/圖標2

在與各刷新組合

viewer.refresh(node, true); 

viewer.refresh(viewer.getGraphModelNode(node), true); 

已經測試的變體/重繪觀察者或其圖形控制的方法,但沒有成功。

的觀衆使用更多的細節:

GraphViewer viewer = new GraphViewer(parent, SWT.BORDER); 
ArrayContentProvider content = new MyArrayContentProvider(..); 

viewer.setContentProvider(content); 
LabelProvider glp = new MyGraphLabelProvider(..); 
viewer.setLabelProvider(glp); 

List<MyNodeClass> nodes = .. //list of all node elements 
viewer.setInput(nodes); 

TriangleSubgraphFactory subGraphFactory = new TriangleSubgraphFactory(); 
SpaceTreeLayoutAlgorithm spaceTreeAlg = new SpaceTreeLayoutAlgorithm(); 

viewer.getGraphControl().setSubgraphFactory(subGraphFactory); 
viewer.getGraphControl().setExpandCollapseManager(
    spaceTreeAlg.getExpandCollapseManager()); 
viewer.setLayoutAlgorithm(spaceTreeAlg, true); 

的代碼按預期工作,除了我上面提到的刷新。

我想我可能會做一些錯誤的事情,因爲根據Fabian的建議調用viewer.setInput(..)會導致錯誤。我也沒有設法使用SpaceTreeLayoutAlgorithm(int方向)除了TOP_DOWN以外的任何方向,否則我得到一個NPE。

調用viewer.setInput後來導致此:

Caused by: java.util.NoSuchElementException 
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:813) 
at java.util.HashMap$KeyIterator.next(HashMap.java:845) 
at org.eclipse.zest.core.widgets.custom.TriangleSubgraph.updateFigure(TriangleSubgraph.java:169) 
at org.eclipse.zest.core.widgets.custom.TriangleSubgraph$1.defaultHandle(TriangleSubgraph.java:147) 
at org.eclipse.zest.layouts.algorithms.TreeLayoutObserver$TreeListener.nodeRemoved(TreeLayoutObserver.java:308) 
at org.eclipse.zest.layouts.algorithms.TreeLayoutObserver$1.nodeRemoved(TreeLayoutObserver.java:344) 
at org.eclipse.zest.core.widgets.InternalLayoutContext.fireNodeRemovedEvent(InternalLayoutContext.java:399) 
at org.eclipse.zest.core.widgets.InternalNodeLayout.dispose(InternalNodeLayout.java:327) 
at org.eclipse.zest.core.widgets.Graph.removeNode(Graph.java:977) 
at org.eclipse.zest.core.widgets.GraphNode.dispose(GraphNode.java:188) 
at org.eclipse.zest.core.viewers.AbstractStructuredGraphViewer.inputChanged(AbstractStructuredGraphViewer.java:494) 
at org.eclipse.zest.core.viewers.GraphViewer.inputChanged(GraphViewer.java:136) 
at org.eclipse.jface.viewers.ContentViewer.setInput(ContentViewer.java:280) 
at org.eclipse.jface.viewers.StructuredViewer.setInput(StructuredViewer.java:1690) 

用於刷新以下的作品,但這不可能是使用目的:

GraphLabelProvider glp 
GraphNode n = viewer.getGraphModelNode(node); 
n.setText(glp.getText(node)); 
n.setImage(glp.getImage(node)); 

回答

2

我不知道你怎麼樣完全使用查看器,但最簡單的方法可能是將查看器的輸入重置爲想要可視化的新數據(您在內容和標籤提供程序中處理的數據)。當您設置輸入時,圖表會自動更新:

viewer.setInput(myChangedDataToBeVisualized); 
+0

這會觸發整個圖形的更新?如果我只需要更新單個節點,那將是非常低效的。我是否使用viewer.refresh錯誤,如果我想觸發單個節點的刷新,應該如何使用它? –

+0

稍後使用viewer.setInput會導致異常。我添加了更多關於我的查看器使用情況的信息,也許我在那裏做了錯誤的事。 –