Для выполнения начальной компоновки вам необходимо вызвать frame.pack()
. Изменение размера окна автоматически приводит к исправлению макета, но frame.setSize(...)
не *.
Переместите frame.setVisible(true)
в конец вашего метода run
(т. Е. После того, как вы построили все элементы пользовательского интерфейса ) и положите frame.pack()
непосредственно перед frame.setVisible(true)
. (Спасибо Hovercraft и MadProgrammer за это указание)
* По крайней мере, это не так, если рамка не видна. Он может работать, если рамка уже видна; попробуйте и посмотрите.
EDIT: теперь, когда я перечитываю javadoc, вы, вероятно, не хотите pack
в конце концов - он изменит размер кадра для вас. Не тестируя его, я думаю, что движение setVisible
до конца будет работать; если вместо этого не использовать revalidate
, а не pack
, чтобы запустить механизм компоновки.
РЕДАКТИРОВАТЬ 2: Теперь, когда я повторно перечитаю javadoc, setVisible
проверит если он еще не отображается. Поэтому вам не нужен явный вызов revalidate
. setSize
будет аннулировать компонент, но не будет revalidate it.
TL; DR: стоит прочитать, как работают валидация и отображаемость в Swing поэтому вы не делаете ошибок, которые я только что сделал.