私はJavaアプリケーションを開発していて、JUNGライブラリを使用しています。私のアプリケーションでは、最初にを作成DelegateTree
して画面に描画します。
public static GraphZoomScrollPane generateTree(Tree tree,
GraphicalUserInterface gui) {
/* Create a new tree */
edu.uci.ics.jung.graph.Tree<Node, Edge> graphTree = new DelegateTree<Node, Edge>();
/* Add all nodes and vertices to the tree */
graphTree.addVertex(tree.getRoot());
addChildren(tree.getRoot(), graphTree);
/* Create the visualization */
TreeLayout<Node, Edge> treeLayout = new TreeLayout<Node, Edge>(graphTree);
VisualizationViewer<Node, Edge> vv = new VisualizationViewer<Node, Edge>(treeLayout);
vv.setBackground(Color.WHITE);
vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller<Edge>());
vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line<Node, Edge>());
vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Node>());
vv.getRenderer().getVertexLabelRenderer().setPosition(Renderer.VertexLabel.Position.S);
vv.addGraphMouseListener(new ClickNode(gui, vv));
final DefaultModalGraphMouse<Node, Edge> graphMouse = new DefaultModalGraphMouse<Node, Edge>();
graphMouse.setMode(ModalGraphMouse.Mode.TRANSFORMING);
vv.setGraphMouse(graphMouse);
return new GraphZoomScrollPane(vv);
}
その後、ユーザーは私のツリーの葉に新しい子を追加できます。しかし、私がするとき
graphTree.addEdge(edge, parent, child);
次に、を再描画するVisualizationViewer
と、ビジュアライゼーションは「ツリー」構造を失いました。親の上のどこかに子を追加し、そのすぐ上にその新しい子の他のすべての子を追加するだけです。
私の木の葉に子供を動的に追加するより良い方法はありますか?それとも、再描画のために、単にではなく何か他のものを使用する必要がありますvv.repaint()
か?
どんな助けでも本当にありがたいです。
何が起こるかの例:
http://www.dylankiss.be/JUNGExample.PNG
ルート(OUTLOOK)から始めて、異なるエッジ(晴れ、曇り、雨)を持つ3つの子(Leaf、Leaf、Leaf)を追加した後、それらは互いに重なり合って表示されます。
編集:これはaddChildren()
方法です。
private static void addChildren(Node node, edu.uci.ics.jung.graph.Tree<Node, Edge> tree) {
for (int i = 0; i < node.getChildren().size(); i++) {
tree.addEdge(new Edge(node.getChildren().get(i).getParentValue()), node, node.getChildren().get(i));
addChildren(node.getChildren().get(i), tree);
}
}
編集2:これはAWT ActionListenerの一部であり、ツリーに新しい子を追加します。
while (there are still edges to be added) {
value = name of new edge;
child = new Node(this.m_node, value);
this.m_node.addChild(child);
graphTree.addEdge(new Edge(value), this.m_node, child);
}