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 попытается расположить столько места для вашего компонента.
Это зависит от того, используете ли вы менеджер макета или нет...