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