Автоматическое изменение размера качающихся элементов в соответствии с размером контейнера
Не уверен, что то, что мне нужно, возможно.
У меня есть контейнер (JPanel), который содержит некоторые внутренние элементы.
Мне было интересно, можно ли заставить внутренние элементы вписаться в размер контейнера.
Мне нужно, чтобы они были полностью видимыми, т.е. Изменяли размер, чтобы вписаться в размер панели, а не отрезать некоторые части внутренних элементов.
Прокрутка не является параметром.
Возможно ли это с помощью макета или чего-то еще?
РЕДАКТИРОВАТЬ: Важное разъяснение:
Дело в том, что у меня нет доступа к внутренним элементам ни к их свойствам, поэтому я бы сказал, что необходим Layoutmanager, способный изменять размер дочерних элементов в соответствии с его размером. Я тестировал BorderLayout и GridBagLayout, но результат всегда один и тот же, внутренние элементы вырезаны.
Ответы
Ответ 1
Именно по этой причине существуют LayoutManagers. Все LayoutManagers
работают для простых контейнеров напрямую, исключая GridBagLayout
, которые могут обрабатывать большинство полных графических интерфейсов напрямую.
Для большинства конкурирующих графических интерфейсов у вас есть несколько вариантов:
- Найдите макет третьей части, например MigLayout или здесь
- Используйте GridBagLayout
- Очень простой способ - использовать вложенный макет, где имеется более одного
JPanel
, и каждый из них имеет дочерний JPanels
с тем же или другим LayoutManager
- Или настраиваемый макет, должен быть сложным..., но так же, как с помощью
GridBagLayout
Ответ 2
Вы можете настроить макет JPanel
на макет границы, а затем добавить одного ребенка в центр. Если существует несколько дочерних элементов, этот подход становится менее полезным, поскольку компоненты, добавленные в теги NORTH
, SOUTH
, EAST
и WEST
, будут оставаться статически, а центр изменяет размер, чтобы заполнить остаток.
Короче говоря, это не идеальное решение. Все макеты в Swing становятся все более сложными из-за того, что разные компоненты ведут себя по-разному, поэтому вам действительно нужно предоставить дополнительные сведения о дочерних компонентах, которые вы хотите добавить в свою панель, и о любом поведении, которое было переопределено на этих компоненты.
Лучший способ - попробовать несколько простых примеров, чтобы узнать, какой пробег вы получите, и поможет ли тонкая редизайн вашего детского компонента вложенности.
Ответ 3
вы можете использовать макет, например GridBagLayout, или BorderLayout в зависимости от ситуации. С соответствующими весами это возможно.
Ответ 4
это звучит для меня так, как будто вы должны просто заглянуть в соответствующий менеджер макетов и использовать его. Например, посмотрите на BorderLayout - поместите свой компонент в CENTER и он будет занимать всю область. Его каждому конкретному менеджеру макета решать, какой размер компонентов будет.
Марк
Ответ 5
Я использовал JInternalFrame внутри JDesktopPane. Я хотел, чтобы inner_frame автоматически изменялся, поскольку размер панели рабочего стола менялся, поэтому мне пришлось реализовать событие AncestorResized для внутреннего фрейма, где я разместил следующий код:
this.setPreferredSize(this.getParent().getPreferredSize());
this.pack();
и это сработало для меня:)