2014-08-27 3 views
0

Существует круг (планета), нарисованный через 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));}} 
+3

Создайте и опубликуйте небольшую, но простую полную программу, которая иллюстрирует вашу проблему, [MCVE] (http://stackoverflow.com/help/mcve). Для получения подробной информации об этом очень полезном инструменте проверьте ссылку. –

+1

Основная идея кажется ОК (хотя вы можете хотеть '(int) planet.getY() - fm.getMaxAscent()/2)'), так как это не работает? Как далеко находится текст? Какова ценность textWidth, и каково положение планеты? – nos

+0

'но не работает правильно.' - что это значит? Всегда ли это справа/слева/сверху/снизу. Мы не читатели. Мы не можем догадаться, в чем проблема. – camickr

ответ

1

Вы используете planet.getX()-planet.getRadius() и planet.getY() - planet.getRadius(), чтобы рассчитать центрированную точку окружности.

Затем нужно добавить текст, который вы хотите рисовать в центральное положение, которое рассчитывается

planet.getX() - planet.getRadius() - textWidth/2 //or centered point - textWidth/2 

который является вашим координаты х и

planet.getY() - planet.getRadius() + fm.getMaxAscent()/2 //or centered point + fm.getMaxAscent()/2 

который будет y- координат.

Но вы используете точку planet.getX() - textWidth/2

Это происхождение должно быть в центре круга, не planet.getX()

1

В прошлом я должен использовать оба значения подъема/спуска для расчета фактического шрифта высота, и похоже, что вы используете только всплытие. Что-то для рассмотрения: не все строки будут иметь такое же максимальное восхождение/спуск для заданного шрифта, поэтому, хотя строка «Dojo» может выглядеть правильно по вертикали, строки «cujo» и «coco» могут не совпадать.

Другое предложение: вместо вычисления полуширины вашего текста и использования этого, чтобы компенсировать начальную позицию чертежа, почему бы не просто обосновать текст по центру?

Смежные вопросы