GridBagLayout: как предотвратить свертывание невидимых компонентов - PullRequest
6 голосов
/ 21 января 2010

Когда отдельные компоненты макета, управляемого GridBagLayout, невидимы, расположение остальных компонентов в макете постоянно меняется. GridBagLayout, по-видимому, «сворачивает» ячейки с невидимыми компонентами, заставляя другие компоненты менять позиции. Это очень раздражающее поведение, и я искал способ удержать его от этого.

Один из методов, которые я попробовал, - это добавить разделитель в одну и ту же ячейку с фиксированным размером, равным предпочтительному размеру компонента, который может быть скрыт, но если этот предпочтительный размер когда-либо изменится, это будет много проблем, чтобы сохранить распорку в синхронизации. Есть ли способ лучше?

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

Ответы [ 4 ]

8 голосов
/ 21 января 2010

А как насчет использования JPanel (или Box) в качестве заполнителя?
Поместите JPanel в каждую ячейку и добавьте компоненты на панели. Если вы сделаете компонент невидимым, панель все равно должна быть там ...

1 голос
/ 21 января 2010

Использование MigLayout

чтобы вернуть радость в макет ^^.

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

Другая альтернатива использует Boxlayout

1 голос
/ 21 января 2010

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

В качестве альтернативы, вы можете попробовать использовать новую (начиная с Java 6) GroupLayout вместо GridBagLayout - это намного проще в использовании и почти такой же мощный.

0 голосов
/ 21 января 2010

IIRC, то, что я сделал в прошлом, это поместил компонент в контейнер (или использовал отдельный компонент), который имитирует размеры исходного компонента, но не является ли он скрытым состоянием. Поместите это в метод или фасад в сетку, и код вашего макета может остаться красивым и чистым.

...