所以我实际上有2个问题。 首先,我可以指定顶点的显示顺序吗?通过这个我的意思是,当我尝试直观地看到顶点的直线时,有时会首先到最后,有时最后到第一个。这是我的代码片段。还有什么更好的方法来做直线比改变垂直维度低?JUNG顶点,二叉树的JUNG的静态顺序
Tree<GraphNode, String> g1 = q.transformToGraph();
Layout<GraphNode, String> layout = new ISOMLayout<GraphNode, String>(g1);
layout.setSize(new Dimension(1600, 25));
VisualizationViewer<GraphNode, String> vv = new VisualizationViewer<GraphNode, String>(layout);
vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line());
VertexLabelAsShapeRenderer<GraphNode, String> vlasr = new VertexLabelAsShapeRenderer<GraphNode, String>(vv.getRenderContext());
vv.getRenderContext().setVertexShapeTransformer(vlasr);
vv.getRenderContext().setVertexLabelTransformer(
new ChainedTransformer<GraphNode, String>(
new Transformer[]{new MyLabeller()}));
vv.getRenderer().setVertexLabelRenderer(vlasr);
return vv;
transformToGraph函数返回DirectedSparseGraph。
也有没有什么办法没有写我自己的布局,使一个很好的二叉树可视化。特别是BST,因为TreeLayout使得边缘在一些边缘的长度和掉期交易双方不同(左是右和周围的其他方法)
Tree<GraphNode, String> g1 = (DelegateTree) q.transformToGraph();
Layout<GraphNode, String> layout = new DynamicTreeLayout<GraphNode, String>(g1, 100, 100);
layout.setSize(new Dimension(1600, 100)); VisualizationViewer<GraphNode, String> vv = new VisualizationViewer<GraphNode, String>(layout);
vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line());
VertexLabelAsShapeRenderer<GraphNode, String> vlasr = new VertexLabelAsShapeRenderer<GraphNode, String>(vv.getRenderContext());
vv.getRenderContext().setVertexShapeTransformer(vlasr);
vv.getRenderContext().setVertexLabelTransformer(
new ChainedTransformer<GraphNode, String>(
new Transformer[]{new MyLabeller()}));
vv.getRenderer().setVertexLabelRenderer(vlasr);
return vv;
这里transformToGraph改变了我对BST DelegateTree。
下面是如何
@Override
public DelegateTree<GraphNode, String> transformToGraph() {
DelegateTree<GraphNode, String> graph = new DelegateTree<GraphNode, String>();
if (root == null) {
graph.setRoot(null);
return graph;
}
GraphNode rootNode = new GraphNode(root.getValue());
graph.setRoot(rootNode);
if (root.getLeft() == root.getRight()) {
return graph;
}
addNodeToGraph(rootNode, root.getLeft(), graph);
addNodeToGraph(rootNode, root.getRight(), graph);
return graph;
}
protected void addNodeToGraph(GraphNode parent, TreeNode node, DelegateTree<GraphNode, String> graph) {
if (node == null) {
return;
}
GraphNode curr = new GraphNode(node.getValue());
graph.addChild(parent.getValue() + node.getValue(), parent, curr);
addNodeToGraph(curr, node.getLeft(), graph);
addNodeToGraph(curr, node.getRight(), graph);
}
TreeLayout应该使用一致的x和y间距来渲染边缘;你有截图显示,否则? –