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

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

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

вместо тог

setPreferredSize(new Dimension(500, 500));

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

 IchBinKeinBaum03 июн. 2012 г., 14:11
Спасибо за ссылку. Хотя немного странно, что в одной из статей, упомянутых в верхнем ответе, говорится «никогда не используйте этот метод [setPreferredSize] !!!» потому что у меня никогда не было проблем с этим. Но опять же, я никогда не писал действительно большие / сложные пользовательские интерфейсы.
 mKorbel03 июн. 2012 г., 14:38
речь идет о программировании на высшем уровне :-), но ругайте будьте советом, как избежать ошибок, никто не говорит там, что использование LayoutManager - легкая работа, требующая а) обучения и попыток, б) задавая несколько вопросов
 mKorbel03 июн. 2012 г., 08:49

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

Решение Вопроса

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

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

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

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

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

 IchBinKeinBaum03 июн. 2012 г., 14:05
Спасибо за разъяснение этого.
 03 июн. 2012 г., 09:05
Хорошее редактирование. Шум удален. +1
 03 июн. 2012 г., 09:04
Спасибо @AndrewThompson, да, это правда - я попытался изменить свой ответ, чтобы отразить это лучше. Я хотел, чтобы это был более жесткий способ задания размера компонентов, но это не обязательно гарантировано.

Ваш ответ на вопрос