java - 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);
}