Использование переопределения getPreferredSize () вместо использования setPreferredSize () для компонентов фиксированного размера

Я прочитал несколько постов здесь и начал понимать, почему некоторые люди делают

@Override
public Dimension getPreferredSize() {
    return new Dimension(500, 500);
}

вместо тог

setPreferredSize(new Dimension(500, 500));

Не лучше ли второй, потому что он создает только одинDimension объект, тогда как первый, возможно, создает несколько (даже если это не так много потраченной памяти)? Или я не прав? Есть ли разница вообще?

Ответы на вопрос(1)

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

Если вы просто позвонитеsetPreferredSize(new Dimension(500, 500)); в вашем коде он будет работать так, как вы ожидаете - он устанавливает предпочтительный размер 500x500. Однако другой код в вашем приложении может потенциально перезаписать это значение новым - все, что может вызватьsetPreferredSize() и последний вызов этого метода будет конечным результатом.

Однако, если вы переопределитеgetPreferredSize() метод в вашем коде, это будетalways вернуть 500х500. Не имеет значения, вызывает ли какой-либо ваш кодsetPreferredSize() метод, потому что они эффективно игнорируются. Если вы также переопределитеgetMinimumSize() а такжеgetMaximumSize()Вы можете принудительно установить фиксированный размер компонента, который не должен изменяться независимо от размера окна и других компонентов.

Однако, как упомянул @Andrew Thompson в комментариях, это не гарантируется, так как некоторые менеджеры компоновки могут игнорировать их, особенно если вы пишете свой собственный менеджер компоновки, а добавление пользовательского компонента в некоторые родительские контейнеры также игнорирует эти методы, в зависимости от того, где / как компонент используется. Независимо от этого он все еще более жесткий, чем вызовsetPreferredSize() который может быть легко вызван другим кодом и полностью перезаписан.

Я также отменяюgetPreferredSize() метод (плюсgetMinimumSize() а такжеgetMaximumSize()) для любого из моих пользовательских компонентов, таких как палитра цветов, который должен иметь определенные размеры, чтобы компонент был правильно окрашен. Без переопределения этих методов менеджеры компоновки Swing не понимают, как ваш пользовательский компонент может располагаться и иметь размеры, соответствующие размеруJFrame или жеJPanel.

ВАШ ОТВЕТ НА ВОПРОС