Размер JPanel по внутренним компонентам - PullRequest
19 голосов
/ 11 мая 2009

Можно ли сказать JPanel установить его размер, чтобы он соответствовал всем компонентам, которые он содержит? Что-то вроде pack() для JFrame.

edit: трюк с предпочитаемым размером не помог. У меня есть JSplitPane, где в одной части находится GridBagLayout со многими метками (см. Скриншот), и метки перекрывают друг друга.

скриншот http://foto.darth.cz/pictures/screen.png

Ответы [ 7 ]

19 голосов
/ 11 мая 2009

После просмотра исходного кода для pack() я придумал:

    panel.setPreferredSize(panel.getPreferredSize());

Это вынуждает панель пересчитывать свой предпочтительный размер на основе предпочтительных размеров его подкомпонентов.

Вы можете или не можете звонить validate() впоследствии; в моем крошечном примере это, кажется, не имеет значения, но Javadoc говорит:

Метод validate используется для того, чтобы контейнер снова размещал свои подкомпоненты. Он должен вызываться, когда подкомпоненты этого контейнера изменены (добавлены или удалены из контейнера, или изменена информация, связанная с макетом) после отображения контейнера.

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

3 голосов
/ 12 мая 2009

По умолчанию Container s имеют предпочтительный размер, который соответствует предпочтительному размеру макета, заданному контейнером. Так что буквально все, что вам нужно сделать, это:

panel.setSize(panel.getPreferredSize());

Предположительно, вы делаете что-то странное с родителем, чтобы остановить менеджер макета родителя, делающий эквивалент этого.

1 голос
/ 07 июля 2016

У меня была похожая проблема при использовании Netbeans GUI Builder . Мои внутренние панели приобретали странные размеры; Я пытался отрегулировать минимальный и предпочтительный размеры вручную, что было очень неприятно.

Проблема была решена, когда я сбросил все минимальные и предпочтительные размеры обратно на значение по умолчанию (В Netbeans GUI Builder: щелкните правой кнопкой мыши компонент JPanel -> Свойства -> предпочитаемый размер -> Восстановить по умолчанию). Когда нет наложенного размера, jpanel принимает размер внутреннего компонента.

Примечание: GridBaLayout использовался в моем случае

1 голос
/ 12 мая 2009

Я бы попробовал:

panel.revalidate();
panel.repaint();

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

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

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

splitPane.setDividerLocation(newSize);

Имейте в виду, что для этого есть два перегруженных метода: один с плавающей точкой, другой с целым числом. Число с плавающей точкой в ​​процентах от размера, в то время как int - это размер в пикселях. Размер для левой панели (или верхней панели для этой ориентации). Я хотел бы рассмотреть возможность изменения расположения разделителя в зависимости от предпочтительной ширины панелей.

1 голос
/ 11 мая 2009

может быть, вы можете сделать что-то подобное, удалив с панели

setResizable (ложь);

0 голосов
/ 05 июля 2015

Тайны javax.swing открываются только постепенно и только тем, кто готов предложить много возлияний (особенно оторванные пучки волос, часы, жгущие полночное масло и т. Д.) Богам Свинга.

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

myJPanel.getTopLevelAncestor().validate()

Как говорится в священном тексте, «проверяет этот контейнер и все его подкомпоненты». (Container.validate). Примечание: getTopLevelAncestor () - это метод JComponent.

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

0 голосов
/ 13 мая 2009

JSplitPanes немного суетливы, когда дело касается размеров детей, посмотрите учебник по Java . Правильно ли вы используете GridBagLayout? Похоже, он не устанавливает правильный минимальный размер JPanel правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...