Java: разница между методами setPreferredSize() и setSize() в компонентах

Хорошо, я прочитал документацию по Java, и я просто не могу понять, в чем основное отличие этих двух методов. Иногда я использовал setSize(), иногда setPreferredSize(), иногда я делаю то, что хочу, иногда другой.

Итак, в чем основное различие между ними? Какой из них следует использовать для JFrames и JPanels?

Спасибо

Ответ 1

Короткий ответ: это сложно.

Немного более длинный ответ: используйте setSize(), если у вашего родителя компонента нет менеджера компоновки и setPreferredSize() и связанных с ним setMinimumSize и setMaximumSize, если это произойдет.

setSize(), вероятно, ничего не сделает, если родитель компонента использует диспетчер компоновки; места, которые, как правило, будут иметь эффект, будут на компонентах верхнего уровня (JFrames и JWindows) и в вещах, находящихся внутри scrolled panes. Вы также должны вызвать setSize(), если у вас есть компоненты внутри родителя без менеджера макетов.

Как правило, setPreferredSize() должен делать "правильную вещь", если у вас есть менеджер макетов; большинство менеджеров макетов работают, получая предпочтительные (а также минимальные и максимальные) размеры своих компонентов, а затем используя setSize() и setLocation() для размещения этих компонентов в соответствии с правилами компоновки. Итак, (в качестве примера) a BorderLayout попытается сделать границы своей "северной" области равными preferred size своего северного компонента - они могут оказаться больше или меньше этого, в зависимости от размера jframe, размер других компонентов в макете и т.д.

Ответ 2

setSize() или setBounds() можно использовать, когда не используется менеджер компоновки.

Однако, если вы используете диспетчер компоновки, вы можете предоставить подсказки менеджеру макетов, используя методы setXXXSize(), такие как setPreferredSize() и setMinimumSize() и т.д.

И убедитесь, что в контейнере компонента используется менеджер компоновки, который соответствует запрашиваемому размеру. Менеджеры FlowLayout, GridBagLayout и SpringLayout используют предпочтительный размер компонента (последние два в зависимости от установленных ограничений), но BorderLayout и GridLayout обычно не указаны. Если вы укажете подсказки нового размера для уже видимого компонента вам нужно вызвать метод revalidate на нем, чтобы убедиться, что его иерархия сдерживания выложена снова. Затем вызовите метод repaint.

Ответ 3

setSize изменит размер компонента до указанного размера.

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

Ответ 4

IIRC...

setSize устанавливает размер компонента.

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

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