2014-05-08 3 views
0

Je suis nouveau à Jung. J'ai besoin de visualiser un arbre contenant plusieurs nœuds. Tout fonctionne bien en utilisant un graphique de type DelegateForest et un TreeLayout. Toutefois, lors de l'ajout d'arêtes, le code s'exécute dans une exception, si des arêtes sont ajoutées au graphique qui se trouvent déjà dans l'arborescence. L'exception est: "Exception dans le thread" principal "java.lang.IllegalArgumentException: l'arborescence ne doit pas déjà contenir l'enfant x". En d'autres termes, si un bord contenant des sommets, qui sont déjà dans le graphe, est ajouté, l'exception ci-dessus est levée. Le code exemple suivant illustre ceci:JUNG Graphique: TreeLayout pour 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); 

L'exception est levée sur la ligne "g2.addEdge (" Edge-3-5-P "3, 5);" Je comprends donc que je dois utiliser le type de graphe SparseMultigraph. Malheureusement, il n'y a pas de disposition ressemblant à TreeLayout que l'on peut utiliser avec le SparseMultigraph. Pouvez-vous me donner un indice sur la façon de résoudre mon problème?

Merci beaucoup d'avance!

+0

Vous ne pouvez pas utiliser TreeLayout pour un graphe qui n'est pas un arbre (et lorsque vous ajoutez l'arête 3-5, le graphe ** n'est plus un arbre). Vous pouvez envisager une mise en page différente, comme SpringLayout ou FRLayout ... – Marco13

Répondre

0

Le commentaire ci-dessus est correct. Cela dit, vous pouvez extraire un arbre couvrant du graphique, le mettre en forme avec TreeLayout, puis utiliser ces positions pour durer tout le graphe. La démo de mise en page minimumspanningtree le démontre.

0

cette exception se produit lorsque vous ajoutez l'enfant à un parent et même enfant à l'autre parent, comme dans votre cas

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

essayez d'ajouter un enfant unique. spécifiquement dans TreeLayout. essayez une autre mise en page, mais je n'ai pas encore essayé une autre mise en page.

Questions connexes