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));
這會觸發整個圖形的更新?如果我只需要更新單個節點,那將是非常低效的。我是否使用viewer.refresh錯誤,如果我想觸發單個節點的刷新,應該如何使用它? –
稍後使用viewer.setInput會導致異常。我添加了更多關於我的查看器使用情況的信息,也許我在那裏做了錯誤的事。 –