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