2016-04-07 2 views
1

Я хочу получить точную высоту моей строки в пикселях на моей панели. Поэтому я написал программу, которая рисует строку, а затем рисует вокруг нее прямоугольник.FontMetrics возвращает неправильную высоту

Использование FontMetrics Я использовал getStringBounds метода, чтобы получить меня ограждающий прямоугольник.

Однако это выглядит не так:

enter image description here

Я ожидал, что прямоугольник отлично вложить свой текст, но есть место на вершине (и чуть-чуть пространства слева и справа). Почему это дает мне этот результат?

Вот мой код:

public class Test extends JPanel { 

    @Override 
    protected void paintComponent(Graphics g) { 

     Font font = new Font("Arial", Font.PLAIN, 60); 
     g.setFont(font); 

     FontMetrics fm = this.getFontMetrics(font); 

     String str = "100dhgt"; 
     Rectangle2D rect = fm.getStringBounds(str, g); 

     int x = 5; 
     int y = 100; 

     g.drawRect(x, y - (int)rect.getHeight(), (int)rect.getWidth(), (int)rect.getHeight()); 
     g.drawString(str, x, y); 
    } 

    public static void main(String[] args) { 
     JFrame f = new JFrame(); 

     Test test = new Test(); 
     f.add(test); 
     f.setVisible(true); 
     f.setSize(400, 400); 
    } 

} 

ответ

2

Что касается вашего прямоугольника, вы должны рассмотреть спуск шрифта на (как это далеко ниже линии)

g.drawString(str, x, y - fm.getDescent()); 

Также обратите внимание, что высота шрифта обычно учитывает некоторый интервал между линиями. В этом случае fm.getDescent() + fm.getAscent() = 68, тогда как fm.getHeight() = 70

2

Пространства в верхней части можно объяснить ваше не принимая во внимание спуска (который берет меня назад к одному из моих любимых методов из Java 1.0: getMaxDecent)

В противном случае коробка выглядит довольно хорошо. Единственный совет, который я могу предложить, что fm.getStringBounds лучше работает с некоторыми шрифтами, чем с другими

+0

Также рассмотрите «TextLayout», рассмотренную здесь [http://stackoverflow.com/a/16014525/ 230513). – trashgod

+0

поэтому границы немного похожи на написание текста на выровненной бумаге? То есть. как в школе, где вам приходилось писать g и y под строкой. –

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

  • Нет связанных вопросов^_^