Как поместить текст внутри круга в java-апплете так, чтобы середина текста находилась в центре

Я пытаюсь написать код для размещения текста в середине круга, чтобы центр строки находился в центре круга. Но текст, кажется, начинается из центра, если размер шрифта строки и диаметр круга большие. Вот мой код,

import java.applet.Applet;
import java.awt.Graphics;
import java.awt.*;
//extending Applet class is necessary
public class Main extends Applet{
public void paint(Graphics g)
    {
        g.setColor(Color.yellow);
        int diameter=500;
        int xpos=100,ypos=100;
        g.fillOval(xpos,ypos,diameter,diameter);
        Font f1 = new Font("Arial",Font.BOLD,24);
        g.setColor(Color.black);
        g.setFont(f1);
        String s="Text inside a circle";
        g.drawString(s,xpos+(diameter/2)-(s.length()/2),ypos+(diameter/2));

    }
}

Это результат, который я получаю:

https://i.stack.imgur.com/ZebQT.png

Но я хочу, чтобы текст был посередине.


person mansoor saad    schedule 27.10.2020    source источник
comment
Здесь только что ответили: lazyfox.io/task/pMn/   -  person tObi    schedule 27.10.2020


Ответы (2)


Но текст, кажется, начинается с центра

Длина переменной String возвращает только количество символов в строке, а не ширину (в пикселях) строки.

Вам нужно знать ширину текста в пикселях, чтобы его можно было расположить по центру круга. Для этого вы используете класс FontMetrics.

FontMetrics fm = g.getFontMetrics();
int width = fm.stringWidth(s);
int offset = (diameter - width ) / 2;
g.drawString(s, xpos + offset, ypos + (diameter / 2));
//g.drawString(s,xpos+(diameter/2)-(s.length()/2),ypos+(diameter/2));

Обратите внимание, что приведенное выше будет центрироваться только в зависимости от ширины. Вы также должны центрировать в зависимости от высоты. Для этого вы можете использовать метод getStringBounds(...). Это также позволит вам лучше приблизиться к центрированию по вертикали. Это вернет прямоугольник, чтобы вы могли использовать ширину и высоту прямоугольника как для горизонтального, так и для вертикального центрирования.

person camickr    schedule 27.10.2020

Вы смещаете вывод строки влево от центра круга, но значение сдвига слишком мало

-(s.length()/2

использует длину строки в символах. Вы можете умножить это значение на коэффициент в зависимости от размера шрифта (24 в вашем случае), но разные символы имеют разную ширину (Arial не является шрифтом фиксированной ширины).

Если вам нужно более точное позиционирование, рассмотрите расчет ширины строки в пикселях. Возможно getFontMetrics + stringWidth. Произвольно найденный пример

person MBo    schedule 27.10.2020