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.