Динамическое изменение размеров областей Layout Manager - PullRequest
4 голосов
/ 17 сентября 2009

В каком менеджере разметки Swing можно программно изменять области разметки? И как это сделать с наименьшими затратами?

Мне нужно создать компонент с функциональностью, аналогичной JSplitPane, но с тремя панелями с нуля. Один из моментов - развернуть / свернуть одну из панелей после нажатия кнопки oneTouchExpandable на разделителе. Но проблема в том, что я не знаю, как реализовать это действие. Я попытался просто установить ширину панели в 0, но область макета, которая содержит эту панель, не сжимается после компонента. Я пытался сделать это во всех Layout Manager, но эффект тот же.

Спасибо.

Ответы [ 4 ]

4 голосов
/ 17 сентября 2009

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

Свойства, на которые вы должны смотреть: preferredSize, minimumSize и maximumSize - менеджеры компоновки основывают свои вычисления на этих свойствах, хотя точный эффект зависит от диспетчера компоновки (например, BorderLayout даст NORTH, SOUTH, WEST и Компоненты EAST имеют свой предпочтительный размер, если это возможно, и назначают остаток компоненту CENTER).

После того, как вы изменили свойства размера, вы должны вызвать revalidate() для контейнера, тогда вы должны увидеть изменения.

3 голосов
/ 17 сентября 2009

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

component.setVisible(false);
panel.revalidate();
panel.repaint(); // this is only required sometimes
2 голосов
/ 17 сентября 2009

Я с ответами revalidate () / предпочитаемый размер, но просто хотел предложить это: не изобретайте колесо! Используйте JideSplitPane (часть бесплатного «Общего слоя» JIDE) - он поддерживает более двух разделений.

1 голос
/ 05 октября 2009

Спасибо всем за ответы. В конце концов я нашел решение из нескольких ответов.

Мое окончательное решение следующее: Я использую BorderLayout, устанавливаю западную, центральную и восточную панели, а затем управляю их размерами, устанавливая PreferredSize для западной и восточной панелей. Схема рендеринга следующая: при разметке компонентов BorderLayout отдает восточным и западным панелям свой PreferredSize, а остальное пространство - центральной панели. Поэтому с помощью простых вычислений я могу безболезненно управлять размером каждой из трех панелей.

Я также добавил разделители (изначально только компоненты JPanel с фиксированным размером) к панелям West и East (их размер также учитывается при расчете). Для динамического изменения размера я обрабатываю события перетаскивания на этих разделителях и пересчитываю размеры панели.

Обновление выполняется с использованием следующего фрагмента: container.setVisible (ложь); container.revalidate (); container.repaint (); container.setVisible (истина);

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

...