Подтвердить что ты не робот

Автоматическое изменение размера качающихся элементов в соответствии с размером контейнера

Не уверен, что то, что мне нужно, возможно. У меня есть контейнер (JPanel), который содержит некоторые внутренние элементы. Мне было интересно, можно ли заставить внутренние элементы вписаться в размер контейнера. Мне нужно, чтобы они были полностью видимыми, т.е. Изменяли размер, чтобы вписаться в размер панели, а не отрезать некоторые части внутренних элементов.

Прокрутка не является параметром.

Возможно ли это с помощью макета или чего-то еще?

РЕДАКТИРОВАТЬ: Важное разъяснение: Дело в том, что у меня нет доступа к внутренним элементам ни к их свойствам, поэтому я бы сказал, что необходим Layoutmanager, способный изменять размер дочерних элементов в соответствии с его размером. Я тестировал BorderLayout и GridBagLayout, но результат всегда один и тот же, внутренние элементы вырезаны.

4b9b3361

Ответ 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();

и это сработало для меня:)