Java: разница между методами setPreferredSize() и setSize () в компонентах
хорошо, я прочитал документацию Java, и я просто не могу понять, в чем основное различие между этими двумя методами. Иногда я использовал setSize()
, иногда setPreferredSize()
, иногда один делает то, что я хочу, иногда другой.
Итак, в чем же основное различие между ними? Какой из них я должен использовать для JFrames
и JPanels
?
спасибо
4 ответа:
короткий ответ: это сложно.
немного более длинный ответ: используйте
setSize()
Если родитель вашего компонента не имеет менеджера компоновки, иsetPreferredSize()
и связанные с нимsetMinimumSize
иsetMaximumSize
если он делает.
setSize()
вероятно, ничего не будет делать, если родительский компонент использует менеджер макетов; места, которые это обычно будет иметь эффект, будут на компонентах верхнего уровня (JFrames
иJWindows
) и вещи, которые находятся внутриscrolled panes
. Вы также должны позвонитьsetSize()
Если у вас есть компоненты внутри родителя без менеджера компоновки.как правило,
setPreferredSize()
должен делать "правильную вещь", если у вас есть менеджер макетов; большинство менеджеров макетов работают, получая предпочтительные (а также минимальные и максимальные) размеры своих компонентов, а затем используяsetSize()
иsetLocation()
чтобы расположить эти компоненты в соответствии с правилами макета. Итак (в качестве примера) aBorderLayout
попытается сделать границы своей "северной" области равнымиpreferred size
его северная составляющая - они могут в конечном итоге больше или меньше, в зависимости от размераjframe
, размер других компонентов в макете, и так далее.
setSize()
илиsetBounds()
может использоваться, когда не используется менеджер компоновки.однако, если вы используете менеджер макетов, вы можете предоставить подсказки менеджеру макетов с помощью
setXXXSize()
методыsetPreferredSize()
иsetMinimumSize()
etc.и убедитесь, что контейнер компонента использует менеджер компоновки, который учитывает требуемый размер. Элемент
FlowLayout
,GridBagLayout
иSpringLayout
менеджеры используют предпочтительный размер компонента (последние два в зависимости от ограничения набор), ноBorderLayout
иGridLayout
обычно нет. если вы указываете новые подсказки размера для компонента, который уже виден, вам нужно вызвать метод revalidate на нем, чтобы убедиться, что его иерархия содержания выложена снова. Затем вызвать метод repaint.