2014-05-08 32 views
0

我是榮格新手。我需要可視化一個包含severel節點的樹。它使用DelegateForest類型和TreeLayout類型的圖表可以正常工作。但是,當添加邊時,如果將邊添加到已存在於樹中的圖中,代碼將運行爲異常。異常是:「線程中的異常」主「java.lang.IllegalArgumentException:樹不能包含子x」。換句話說,如果添加包含頂點的邊(已經在圖中),則拋出上述異常。以下示例代碼演示此:JUNG圖:TreeLayout for SparseMultigraph

Forest<Integer, String> g2 = new DelegateForest<Integer, String>(); 
g2.addVertex((Integer) 1); 
g2.addVertex((Integer) 2); 
g2.addVertex((Integer) 3); 
g2.addVertex((Integer) 4); 
g2.addVertex((Integer) 5); 
g2.addEdge("Edge-1-3", 1, 3); 
g2.addEdge("Edge-2-3-P", 2, 3); 
g2.addEdge("Edge-4-3-P", 4, 3); 
g2.addEdge("Edge-4-5-P", 4, 5); 
g2.addEdge("Edge-3-5-P", 3, 5); 

Layout<Integer, String> layout = new TreeLayout<Integer, String>(g2); 

VisualizationViewer<Integer, String> vv = new VisualizationViewer<Integer, String>(layout); 
vv.setPreferredSize(new Dimension(800, 600)); 
vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller()); 
vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller()); 
vv.getRenderer().getVertexLabelRenderer().setPosition(Position.CNTR); 

JFrame frame = new JFrame("Simple Graph View"); 
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.getContentPane().add(vv); 
frame.pack(); 
frame.setVisible(true); 

的拋出異常就行 「g2.addEdge(」 邊緣-3-5-P 「3,5);」

所以我明白我必須使用圖形類型SparseMultigraph。不幸的是,沒有看起來像TreeLayout的佈局,可以使用SparseMultigraph。你能給我一個關於如何解決我的問題的提示嗎?

非常感謝提前!

+0

對於不是樹的圖,你不能使用TreeLayout(並且當你添加邊3-5時,圖**不再是樹)。你可以考慮一個不同的佈局,比如SpringLayout或者FRLayout ... – Marco13

回答

0

以上評論是正確的。也就是說,你可以從圖中提取一棵生成樹,用TreeLayout進行處理,然後使用這些位置來保存整個Graph。 minimumspanningtree佈局演示演示了這一點。

0

,當你到一個家長和孩子一樣增加孩子另一個父,在你的情況

g2.addEdge此異常發生( 「邊緣-4-5-P」,4,5); g2.addEdge(「Edge-3-5-P」,3,5);

嘗試添加獨特的孩子。特別是在TreeLayout中。嘗試另一個佈局,但我還沒有嘗試過其他佈局。