圆圈中心的文字

时间:2014-08-27 13:09:58

标签: java swing

有一个圆圈(行星),通过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));}}

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"可能没有。

另一个建议:不是计算文字的半宽并使用它来抵消你的绘图起始位置,为什么不只是居中对齐文本呢?