我正在开发一个 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 个具有不同边缘(晴天、阴天、雨天)的子节点(叶子、叶子、叶子)后,它们只是彼此重叠。
编辑:这是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);
}