Как мы выполняем измерения текста без предварительного вызова paintComponent? - PullRequest
4 голосов
/ 25 ноября 2011

Привет, все, что мне нужно для измерения текста, используя java.awt.font.FontRenderContext, однако этот класс требует от меня предоставления графического объекта.

Из того, что я знаю, единственный способ, которым я могзахват графического объекта осуществляется с помощью методов paintComponent / paint:

@Override public void paintComponent(java.awt.Graphics g){ //...

Однако мне нужно выполнить это измерение еще до вызова метода paintComponent.Мне было интересно, как лучше всего решить эту проблему?

Создать ли фиктивную JLabel для этой работы?

Ответы [ 5 ]

4 голосов
/ 25 ноября 2011

Однако мне нужно выполнить это измерение даже до вызова метода paintComponent

Возможно, вам следует переопределить метод getPreferredSize () компонента.Вот как компоненты Swing знают, как определять размеры и расположение компонентов до того, как они будут видны.

JLabel использует следующее:

FontMetrics fm = getFontMetrics(getFont());

Или, если вам нужен FontRenderContext (), вы можете, вероятно,используйте метод getGraphics() объекта.Обычно я рекомендую не использовать этот метод, но это потому, что люди тогда пытаются сделать пользовательское рисование с объектом Graphics.Однако в этом случае вы просто хотите, чтобы объект Graphics измерял текст, поэтому все должно быть в порядке.

4 голосов
/ 25 ноября 2011

Нет необходимости создавать фиктивные компоненты GUI. Например, вы можете создать BufferedImage

Graphics g = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB).getGraphics();
3 голосов
/ 25 ноября 2011

TextLayout может быть полезным в этом контексте.Этот пример сравнивает результат с результатом, полученным из FontMetrics текстового компонента, а этот пример расширяется на предложение BufferedImage @ aioobe.

2 голосов
/ 01 июня 2012

Или вы можете сделать это в конструкторе компонентов

Font font = Font.createFont(Font.TRUETYPE_FONT, new File("ARIAL.TTF"));
font = font.deriveFont(12f);
FontMetrics fontMetrics = getFontMetrics(font);
0 голосов
/ 14 июля 2015

Исходя из ответа aioobe, это умный способ получить графику.Может быть, все это понимают, но объект Graphics поставляется с определенным шрифтом, который при обычном способе получения графики aioobe может быть любым.

Мне пришлось сделать это (Jython):

g = java.awt.image.BufferedImage(1, 1, java.awt.image.BufferedImage.TYPE_INT_RGB).graphics
g.font = my_table.font

После этого, это дает точную цифру, прежде чем что-либо было реализовано ... ура:

hw_width = g.fontMetrics.stringWidth( "Hello World" )
...