Использование переопределения 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() в своем коде, он всегда будет возвращать 500x500. Не имеет значения, вызывает ли какой-либо из вашего кода метод setPreferredSize(), потому что они эффективно игнорируются. Если вы также переопределите getMinimumSize() и getMaximumSize(), вы можете принудительно установить фиксированный размер на компонент, который не должен меняться независимо от размера окна и других компонентов.

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

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