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

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

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

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

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

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

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

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

Спасибо

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

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

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

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

FlowLayout всегда уважаемый размер компонентов независимо.

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

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

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

Ответы на вопрос(2)

Ваш ответ на вопрос