Вопрос

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

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

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

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 и фиксированных управляющих координат)

  • Есть ли какой-нибудь способ достичь этого?
  • Является ли весь мой дизайн ошибочным?

Редактировать: Если это возможно, я хотел бы сохранить менеджера групповых игр.

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

Примеры

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top