Когда 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 уменьшил высоту компонентов до того, что казалось нулевым, но не коснулось ширины.