JUNG Graph:SparseMultigraph的TreeLayout

时间:2014-05-08 19:39:01

标签: java graph jung

我是Jung的新手。我需要可视化包含severel节点的树。使用DelegateForest类型和TreeLayout类型的图表一切正常。但是,添加边时,如果将边添加到树中已有的边,则代码会遇到异常。例外是:"线程中的异常" main" java.lang.IllegalArgumentException:树必须不包含子x"。换句话说,如果添加包含已在图中的顶点的边,则抛出上述异常。以下示例代码演示了这一点:

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);

该行上出现例外情况&#34; g2.addEdge(&#34; Edge-3-5-P&#34;,3,5);&#34;

所以我明白我必须使用图表类型SparseMultigraph。不幸的是,没有任何布局看起来像可以与SparseMultigraph一起使用的TreeLayout。你能给我一个如何解决我的问题的提示吗?

非常感谢提前!

2 个答案:

答案 0 :(得分:0)

以上评论是正确的。也就是说,您可以从图中提取生成树,使用TreeLayout进行布局,然后使用这些位置来持续整个图。 minimumspanningtree布局演示演示了这一点。

答案 1 :(得分:0)

当您将一个父级和同一个孩子添加到另一个父级时,会发生此异常,如您的情况

  

g2.addEdge(“Edge-4-5-P”,4,5); g2.addEdge(“Edge-3-5-P”,3,5);

尝试添加独特的孩子。特别是在TreeLayout中。尝试另一种布局,但我还没有尝试过另一种布局。