Палец вверх 4
Перевод
Перевод

Как мы выполняем измерения текста без предварительного вызова paintComponent?

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

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

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

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

Я создаю фиктивную JLabel, чтобы сделать работу?

java swing text graphics measurement
задан Pacerier 25 нояб. 2011 г., 14:19:53
источник

5 ответов

Решение 4
Перевод
Перевод

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

Graphics g = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB).getGraphics();
ответ дан aioobe 25 нояб. 2011 г., 14:23:50
источник
Палец вверх 4
Перевод
Перевод

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

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

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

FontMetrics fm = getFontMetrics(getFont());

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

ответ дан camickr 25 нояб. 2011 г., 20:22:20
источник
Палец вверх 3
Перевод
Перевод

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

ответ дан trashgod 25 нояб. 2011 г., 16:45:59
источник
Палец вверх 2
Перевод
Перевод

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

Font font = Font.createFont(Font.TRUETYPE_FONT, new File("ARIAL.TTF"));
font = font.deriveFont(12f);
FontMetrics fontMetrics = getFontMetrics(font);
ответ дан Sankirthan 1 июн. 2012 г., 19:27:38
источник
Палец вверх 0
Перевод
Перевод

Исходя из ответа 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" )
ответ дан mike rodent 14 июл. 2015 г., 23:28:47
источник