Фундаментальное, но тонкое предположение здесь: расположение и размер непосредственно связаны, 1 к 1 . Это не так, , и это распространенное предположение в программировании на Swing. Размер является результатом компоновки и ограничений по размеру .
Расположение:
- В указанных вами ограниченных пространствах
- И учитывая компоненты, которые я должен вписать в это пространство
- Позиционирование этих компонентов относительно друг друга с учетом указанной стратегии (BoxLayout, BorderLayout и т. Д.)
Если LayoutManager может соответствовать компонентам, которые вы ему предоставили, без изменения общего размера контейнера, не изменит размера контейнера. С другой стороны, вызов pack является явным запросом к минимизации используемого пространства . Это основная причина, по которой вы видите результаты.
Некоторые вещи, которые вы можете попробовать:
- Убедитесь, что вы устанавливаете максимальный размер для ваших компонентов / контейнеров, что налагает ограничения на размер компонентов при повторном выполнении макета
- Всегда звоните pack () по привычке
- Попробуйте некоторые предложения, касающиеся общих проблем с макетом
С Swing сложно, потому что вы должны понимать конвейер рисования, менеджеры компоновки и некоторые детали оконной системы. Когда дело доходит до документации Swing (и всех методов и нескольких различных способов сделать что-либо одно), я стараюсь читать документацию с подходом «ничего не брать», имея в виду: «Какова минимально возможная вещь, которую этот метод документация подразумевает, что это может произойти ", и если вы не наблюдаете дополнительное поведение, не обманывайте себя, думая, что оно делает больше, чем это.
Наконец, я хотел бы добавить, что работа LayoutManager в целом заключается не в определении размеров контейнеров, а в том, чтобы размещать компоненты в некотором отношении друг к другу, в соответствии со стратегией (это обсуждается в дополнительные подробности здесь ). Идея заключается в том, что с помощью соответствующего LayoutManager вы задаете базовый макет стратегии , и в результате этого при изменении размера окна LayoutManager будет разумно перемещать компоненты так, чтобы ваш пользовательский интерфейс продолжал следовать этой общей стратегии. , Таким образом, макеты в основном должны быть независимыми от общего размера пространства, в котором они работают, поэтому они стараются не делать предположений о том, какое пространство доступно - вместо этого они берут размер, который им дают, и попытаться сделать то, что имеет смысл. Если вы явно не наложите ограничения на размер ваших компонентов, вы не сможете гарантировать, какого размера они будут.
Это означает, что, если LayoutManager не считает, что ему нужно изменить размер чего-либо, чтобы соответствовать общей стратегии, в основном он не изменит его . С другой стороны, вызов pack - это явный запрос собрать вещи вместе и удалить дополнительное пространство.