Java 手动遍历并绘制树

Java 手动遍历并绘制树,java,swing,tree,hierarchy,Java,Swing,Tree,Hierarchy,我试图从节点列表中手动绘制分层树。每个节点都是包含在方法中的信息的对象,例如: node.getParent() node.getChildrenCount() 我遇到的问题是绘制树的金字塔结构(正确地缩进子节点),中间的根位于中间,儿童向下对称地展开。 private void drawTree(Graphics2D graphics) { int width = 110; int height = 40; int y = 10;

我试图从节点列表中手动绘制分层树。每个节点都是包含在方法中的信息的对象,例如:

node.getParent()
node.getChildrenCount()

我遇到的问题是绘制树的金字塔结构(正确地缩进子节点),中间的根位于中间,儿童向下对称地展开。

private void drawTree(Graphics2D graphics) {
        int width = 110;
        int height = 40;
        int y = 10;
        for (int i = 0, nodesSize = nodes.size(); i < nodesSize; i++) {
            AttributedNode node = nodes.get(i);
            Rectangle rectangle;
            if (i == 1) { // draw root
                rectangle = new Rectangle(getRootX(), y, width, height);
            } else {
                if (node.getChildCount() == 1) { // if one child draw beneath
                    rectangle = new Rectangle(getRootX(), y, width, height);
                } else {
                    rectangle = new Rectangle(getRootX() + 40, y, width, height);
                }
            }
            y += 50;
            graphics.draw(rectangle);
            addStringToRectangle(graphics, rectangle, node.getText());
        }
    }
private void绘图树(Graphics2D图形){
整数宽度=110;
内部高度=40;
int y=10;
对于(int i=0,nodesSize=nodes.size();i
到目前为止我所拥有的:
以及我想要实现的目标:

任何帮助都将不胜感激。

递归可能会为您的问题提供一个很好的解决方案

public void drawTree(Node node, Graphics2D graphics) {
    if(node != null){
        //drawTree(node.leftChild);
        //drawTree(node.rightChild);
        //draw this node.
    }
} 

我用过一些伪代码,但如果你能发展出这个想法,可能会有所帮助。我建议考虑把它画在纸上干运行这个简单的想法。仔细阅读预订单、顺序和后订单:)

这种布局往往很难做好。也许在你的应用程序中只生成图形的文本表示并使用(例如)编译并生成最终图像会更容易?@MichałKosmulski我以前试过,但从我的ANTLR树生成的.dot信息非常糟糕。但是,感谢您的评论,我再次尝试,并通过扩展org.antlr.runtime.tree.DOTTreeGenerator实现了我自己的类。还没有找到将.dot控制台输出转换为图形的方法,但这绝对是个好主意。谢谢请看一看这个,尽管它只提供了一种在控制台上实现这一点的方法(并非完全如您所愿),尽管稍加修改,我想您也可以将其合并到Swing应用程序中:-)