Когда getGraphics () вернет действительный графический экземпляр? - PullRequest
6 голосов
/ 16 февраля 2010

Я пытаюсь отобразить пользовательский компонент Swing, где я расширил класс JComponent.

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

Мне нужно, чтобы размер моего компонента точно соответствовал сумме ширины и высоты моих отрисованных строк.

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

Проблема в том, что когда я обращаюсь к getGraphics (), он всегда равен нулю, поэтому я не могу получить экземпляр FontMetrics. Если я подожду, чтобы вычислить размер моего компонента из переопределенного метода paintComponent (), это будет слишком поздно (у компонента уже есть размер, верно?).

В документации сказано, что «этот метод вернет ноль, если этот компонент в настоящее время не отображается». Итак, когда я узнаю, когда компонент готов к отображению и имеет объект Graphics для меня, чтобы изменить его размер?

Каков порядок вызова Swing для рендеринга компонента после вызова фрейма setVisible (true)?

Спасибо


Обновление : вторник, 6 февраля 2010 г., 23: 34

Как упоминалось ниже в комментариях, GridLayout вообще не уважает setXxxSize (). Для всех, кто интересуется, я опубликовал результаты использования GridLayout, BoxLayout и FlowLayout, используя простой фрейм, который получает 5 компонентов фиксированного размера шириной 200 и высотой 50 (установив min, max и предпочитаемый).

Результаты теста:

Размер GridLayout всегда изменяется по ширине и высоте (как указано в комментариях)

FlowLayout всегда учитывал размер компонентов независимо от *. 1032 *

Что касается BoxLayout ...

PAGE_AXIS и Y_AXIS сократили ширину компонентов примерно до половины их размера (104), но не уменьшили высоту.

LINE_AXIS и X_AXIS сократили высоту компонентов до того, что казалось нулевым, но не коснулись ширины.

Ответы [ 2 ]

7 голосов
/ 16 февраля 2010

Во-первых, вы можете измерить ваши строки, используя класс TextLayout и связанный с ним материал. Например

public static void main(final String[] args) throws Exception
{
    final FontRenderContext frc = new FontRenderContext(null, true, true);
    final Font font = new Font("serif", Font.PLAIN, 18);
    final TextLayout layout = new TextLayout("This is a test", font, frc);
    final Rectangle2D bounds = layout.getBounds();
    System.err.println((int) (bounds.getWidth() + .5));
}

Во-вторых, вы можете получить информацию о том, когда ваш компонент стал видимым, с помощью ComponentListener , но это не обязательно для измерения ваших строк "заранее"!

2 голосов
/ 16 февраля 2010

Используйте JLabel для рендеринга ваших строк, тогда вы можете просто использовать метод getPreferredSize () метки thel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...