В чем основная разница между setSize()
и setPreferredSize()
. Иногда я использовал setSize()
, иногда setPreferredSize()
, иногда одно делает то, что я хочу, иногда другое.
Какой вызов следует использовать для JFrame
s и JPanel
s?
В чем основная разница между setSize()
и setPreferredSize()
. Иногда я использовал setSize()
, иногда setPreferredSize()
, иногда одно делает то, что я хочу, иногда другое.
Какой вызов следует использовать для JFrame
s и JPanel
s?
Использование зависит от того, есть ли у родителя компонента менеджер компоновки или нет.
setSize()
-- использовать, когда родительского менеджера компоновки не существует;setPreferredSize()
(также связанные с ним setMinimumSize
и setMaximumSize
) -- используйте, когда существует родительский менеджер компоновки.Метод setSize()
, вероятно, ничего не сделает, если родитель компонента использует менеджер компоновки; обычно это влияет на компоненты верхнего уровня (JFrame
s и JWindow
s) и элементы внутри прокручиваемых панелей. Вы также должны вызывать setSize()
, если у вас есть компоненты внутри родителя без менеджера компоновки.
Как правило, setPreferredSize()
компонует компоненты, как и ожидалось, если присутствует менеджер компоновки; большинство менеджеров компоновки работают, получая предпочтительные (а также минимальные и максимальные) размеры своих компонентов, а затем используя setSize()
и setLocation()
для позиционирования этих компонентов в соответствии с правилами компоновки.
Например, BorderLayout
пытается сделать границы своей северной области равными предпочтительному размеру своего северного компонента --- они могут оказаться больше или меньше этого, в зависимости от размера JFrame
, размера других компонентов. в макете и так далее.
setSize()
или setBounds()
можно использовать, когда менеджер компоновки не используется.
Однако, если вы используете менеджер компоновки, вы можете предоставить подсказки менеджеру компоновки, используя методы setXXXSize()
, такие как setPreferredSize()
и setMinimumSize()
и т. д.
И убедитесь, что контейнер компонента использует менеджер компоновки, который учитывает запрошенный размер. Менеджеры FlowLayout
, GridBagLayout
и SpringLayout
используют предпочтительный размер компонента (последние два зависят от установленных вами ограничений), но BorderLayout
и GridLayout
обычно этого не делают. Если вы указываете новые подсказки размера для уже видимого компонента, вам нужно вызовите для него метод revalidate, чтобы убедиться, что его иерархия сдерживания выложена снова. Затем вызовите метод перерисовки.
setSize
изменит размер компонента до указанного размера.
setPreferredSize
устанавливает предпочтительный размер. На самом деле компонент может не иметь такого размера в зависимости от размера контейнера, в котором он находится, или если пользователь изменил размер компонента вручную.
IIRC ...
setSize
устанавливает размер компонента.
setPreferredSize
устанавливает предпочтительный размер. Layoutmanager попытается выделить столько места для вашего компонента.
Это зависит от того, используете ли вы менеджер компоновки или нет...