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


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

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

спасибо

4 93

4 ответа:

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

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

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

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

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

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

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

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

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

IIRC ...

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

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

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