Может ли менеджер верстки создать несколько JPanels? - PullRequest
3 голосов
/ 29 января 2009

Мне нужно построить довольно большую форму со множеством элементов управления. Элементы управления разделены на базовые элементы управления / настройки и расширенные элементы управления / настройки. Пользователь может решить, хочет ли он видеть только базовые или базовые и расширенные элементы управления.

Я поместил все расширенные элементы управления на их собственную JPanel, чтобы я мог легко переключаться между двумя видами, показывая или скрывая эту панель.

В настоящее время я использую GroupLayout, и получается, что элементы управления на разных панелях не выровнены:

Label aaa:     Text field
Label a:       Text field
Label aaaaaa:  Text field
----------------------------
Label b:    Text field
Label bbb:  Text field
Label bb:   Text field

К сожалению, теперь я нашел способ «синхронизировать» макеты двух панелей (кроме использования AbsoluteLayout и фиксированных контрольных координат)

  • Есть ли способ достичь этого?
  • Неужели весь мой дизайн несовершенен?

РЕДАКТИРОВАТЬ: Если это возможно, я хотел бы сохранить менеджер GroupLayout.

Ответы [ 6 ]

2 голосов
/ 29 января 2009

Насколько я знаю, ни один Swing LayoutManager (из JRE или с открытым исходным кодом) не может охватывать несколько панелей.

В настоящее время я работаю над такой функцией (которую я назвал "синхронизацией макетов") для моего DesignGridLayout проекта, но его не так-то просто реализовать (я начал около 2 недель назад и до сих пор не знаю точно, когда и когда я доберусь до чего-то интересного, но у меня все еще большая надежда на это; -))

Один из вариантов, который вы могли бы проверить, - добавить все компоненты на одну панель (затем только с одним GroupLayout) и скрыть / показать их в зависимости от выбора пользователя. Надеемся, что GroupLayout адаптирует размер к ситуации (после вызова pack ()).

Если GroupLayout ведет себя хорошо, то будет просто вызывать метод pack () каждый раз, когда пользователь изменяет свой выбор, чтобы показать / скрыть расширенные поля.

В противном случае вам придется вручную устанавливать размер панели каждый раз, когда пользователь изменяет свой выбор.

1 голос
/ 29 января 2009

Я думаю, что нет никакого способа сделать это со стандартными менеджерами по расположению. Возможно, вам придется написать свой собственный менеджер макетов, но это не должно быть слишком сложно, если вы подкласса GroupLayout.

1 голос
/ 29 января 2009

Вероятно, самый простой (хороший) способ сделать это - добавить все компоненты на главную панель. Установите непанели для подпанелей и добавьте также к главной панели. Главная панель нуждается в оптимизированном чертеже, чтобы быть выключенным.

Еще одна техника - добавить спейсерный компонент. На нижнюю панель добавьте компонент в том же столбце, что и метки, который динамически берет компонент ширины различных методов размера из верхних меток. Сделайте то же самое в обратном порядке к верхней панели.

0 голосов
/ 29 января 2009

Если вы хотите сохранить их на отдельных панелях с разметкой:

Переберите все надписи, которые вы добавляете, и найдите максимальную предпочтительную ширину каждой из них. Повторите итерацию во второй раз, и установите предпочтительный размер, соответствующий предпочтительной высоте каждой метки, но максимальной ширине.

0 голосов
/ 29 января 2009

Это объяснение th GridLayout . Это установит размер каждого компонента, как вы и ожидаете. С помощью объекта GridData вы можете указать порядок компонентов.

Примеры

alt text
(источник: sun.com )

0 голосов
/ 29 января 2009

Вы можете использовать GridLayout вместо GroupLayout, что даст вам равномерный интервал между столбцами

...