有一个圆圈(行星),通过fillOval()绘制。我需要在圆圈上写下文本(数字),以便它必须始终准确地在中心对齐。圆的中心及其半径。 我知道我需要计算文本的宽度和长度(由getStringBounds尝试),但是无法正常工作。
protected void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
for (Planet planet : planets) {
g2d.setColor(planet.getColor());
g2d.fillOval((int) planet.getX() - planet.getRadius(), (int) planet.getY() - planet.getRadius(),
planet.getRadius() * 2, planet.getRadius() * 2);
g.setFont(new Font("Serif", Font.PLAIN, 20));
g.setColor(Color.black);
String s = String.valueOf(250);
FontMetrics fm = g.getFontMetrics();
double textWidth = fm.getStringBounds(s, g).getWidth();
g.setColor(Color.white);
g.drawString(s, (int) ((int) planet.getX() - textWidth/2), ((int) planet.getY() + fm.getMaxAscent() / 2));}}
答案 0 :(得分:1)
您正在使用planet.getX()-planet.getRadius()
和planet.getY() - planet.getRadius()
来计算圆圈的中心点。
然后你必须在中心位置添加你想要绘制的文本,这是计算的
planet.getX() - planet.getRadius() - textWidth/2 //or centered point - textWidth/2
这是你的x坐标和
planet.getY() - planet.getRadius() + fm.getMaxAscent() / 2 //or centered point + fm.getMaxAscent()/2
将是y坐标。
但您使用的是planet.getX() - textWidth/2
此原点必须是圆的中心,而不是planet.getX()
答案 1 :(得分:1)
在过去,我必须使用上升/下降值来计算实际字体高度,看起来你只是使用上升。需要考虑的事项:并非所有字符串都会对给定字体具有相同的最大上升/下降,因此字符串" Dojo"可能看起来是正确垂直对齐的,字符串" cujo"和" coco"可能没有。
另一个建议:不是计算文字的半宽并使用它来抵消你的绘图起始位置,为什么不只是居中对齐文本呢?