Вот что происходит:
getPreferredSize()
проверяет, был ли установлен размер ранее.Если нет, метод запрашивает LayoutManager самого компонента (который является вашим JPanel) о предпочтительном размере, который затем рассчитывается из компонентов. setPreferredSize(...)
затем устанавливает это значение в JPanel, запоминая егона потом. - Позже вы удаляете некоторые компоненты JPanel.
- Даже позже, когда окно пытается изменить свой макет (или ему это приказано), окно (или панель содержимого)/ RootPane's / ...) Layoutmanager снова вызывает метод JPanel
getPreferredSize()
. - now
getPreferredSize()
не запрашивает LayoutManager в JPanel, а просто возвращает сохраненный размер, ранее установленный setPreferredSize()
.
Для ширины BorderLayout игнорирует предпочтительную ширину северного и южного компонентов, она учитывает только CENTER, EAST и WEST.(Аналогично для высоты).
Я только что посмотрел на реализацию BorderLayout.preferredLayoutSize
(в 1.6.0_13 от Sun), и она работает так:
Ширинарассчитывается как
max( EAST.width + CENTER.width + WEST.width + h-gaps,
NORTH.width, SOUTH.width ) + insets
Высота рассчитывается как
max( EAST.height, CENTER.height, WEST.height)
+ NORTH.height + SOUTH.height + v-gaps + insets
(Каждый из width
/ height
является значением preferredSize
этих компонентов.)Если некоторые из пяти компонентов отсутствуют, их высота / ширина не учитываются, равно как и пропуски.)
Он работает так же для minimalLayoutSize
, тогда как maximumLayoutSize
просто возвращает Integer.MAX_VALUE
.
Итак, в принципе все должно работать "из коробки".
Но в целом, если расположение окна не находится под вашим контролем, вам не нужно беспокоиться о компонентах, не находящихся под вашим контролемотрубается: -)