首页 > 解决方案 > Java Graphics 不在 if else 或递归内部绘制

问题描述

我正在尝试使用 java 中的 Icon 绘制生命树之类的东西,但绘制不正确。下面是我的paintIcon 方法为了绘制树而调用的代码。我后来在任何 if 语句之外添加了代码,只要它是调用 draw 的 paintIcon 方法,就可以正确绘制。递归调用 draw 和 if 语句中的任何 g.drawString 或 g.drawLine 线不会绘制任何东西。有什么理由会发生这种情况吗?对不起,如果这是太多或太少的信息。


public void draw(Taxon t, Graphics2D g, int xStep, int yStep) {
        if(!t.isDrawn()) {
            // does special action if drawing a leaf
            if(t.getChildren().size() == 0) {
                //leaves are all aligned on the right and get drawn in a column
                t.setX(width - 100);
                t.setY(50 + yStep * leafCount);
                g.drawString(t.getName(), t.getX(), t.getY());
                leafCount++;
                t.setDrawn(true);
                System.out.print("leaf");
            }
            else {
                //draws all the children first
                for(Taxon c : t.getChildren()) {
                    draw(c, g, yStep, xStep);
                }
                
                //x needs to be x step away from children while y is in the middle
                t.setX(t.getChildren().get(0).getX() - xStep);
                int average = 0;
                for(Taxon c : t.getChildren()) {
                    average += c.getY();
                }
                t.setY(average / t.getChildren().size());
                
                //draw connecting lines
                for(Taxon c : t.getChildren()) {
                    g.drawLine(t.getX(), t.getY(), c.getX(), c.getY());
                }
                
                //getting info for filling up space behind node text since lines might overlap
                FontMetrics fm = g.getFontMetrics();
                Rectangle2D r = fm.getStringBounds(t.getName(), g);
                
                //draw the highlight then the text itself
                g.setColor(Color.WHITE);
                g.fillRect(t.getX(), t.getY() - fm.getAscent(), (int)r.getWidth(), (int)r.getHeight());
                g.setColor(Color.BLACK);
                g.drawString(t.getName(), t.getX(), t.getY());
                t.setDrawn(true);
                System.out.print("node");
            }
        }
        FontMetrics fm = g.getFontMetrics();
        Rectangle2D r = fm.getStringBounds(t.getName(), g);
        g.setColor(Color.WHITE);
        g.fillRect(t.getX(), t.getY() - fm.getAscent(), (int)r.getWidth(), (int)r.getHeight());
        g.setColor(Color.BLACK);
        g.drawString(t.getName(), t.getX(), t.getY());
        t.setDrawn(true);
    }

标签: javaswing

解决方案


推荐阅读