Каковы побочные эффекты setPreferredSize? - PullRequest
3 голосов
/ 24 февраля 2011

У меня есть окно, содержащее несколько панелей. У меня нет доступа к коду окна. (Я могу изменить только код панели.)

Я удалил несколько компонентов с панели. Окно уменьшилось в размере. Но окно слишком маленькое, чтобы все отображалось правильно.

Я добавил строку setPreferredSize(getPreferredSize());. Теперь окно имеет правильный размер.

Каковы побочные эффекты setPreferredSize?

Редактировать: BorderLayout используется. Который должен игнорировать getXXXSize (). Моя панель находится в центре. Панель, которая не умещается на экране, находится на СЕВЕР.

Ответы [ 3 ]

3 голосов
/ 24 февраля 2011

Вот что происходит:

  • getPreferredSize() проверяет, был ли установлен размер ранее.Если нет, метод запрашивает LayoutManager самого компонента (который является вашим JPanel) о предпочтительном размере, который затем рассчитывается из компонентов.
  • setPreferredSize(...) затем устанавливает это значение в JPanel, запоминая егона потом.
  • Позже вы удаляете некоторые компоненты JPanel.
  • Даже позже, когда окно пытается изменить свой макет (или ему это приказано), окно (или панель содержимого)/ RootPane's / ...) Layoutmanager снова вызывает метод JPanel getPreferredSize().
  • now getPreferredSize() не запрашивает LayoutManager в JPanel, а просто возвращает сохраненный размер, ранее установленный setPreferredSize().

Для ширины BorderLayout игнорирует предпочтительную ширину северного и южного компонентов, она учитывает только CENTER, EAST и WEST.(Аналогично для высоты).

Я только что посмотрел на реализацию BorderLayout.preferredLayoutSize (в 1.6.0_13 от Sun), и она работает так:

Ширинарассчитывается как

max(  EAST.width + CENTER.width + WEST.width + h-gaps,
      NORTH.width, SOUTH.width ) + insets

Высота рассчитывается как

max( EAST.height, CENTER.height, WEST.height)
+ NORTH.height + SOUTH.height + v-gaps + insets

(Каждый из width / height является значением preferredSize этих компонентов.)Если некоторые из пяти компонентов отсутствуют, их высота / ширина не учитываются, равно как и пропуски.)

Он работает так же для minimalLayoutSize, тогда как maximumLayoutSize просто возвращает Integer.MAX_VALUE.

Итак, в принципе все должно работать "из коробки".

Но в целом, если расположение окна не находится под вашим контролем, вам не нужно беспокоиться о компонентах, не находящихся под вашим контролемотрубается: -)

2 голосов
/ 24 февраля 2011

Да , это имеет большой эффект.Эффект зависит от

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

Основная причина в том, что после вызоваsetPreferredSize (), чтобы установить размер, компонент больше не будет спрашивать пользовательский интерфейс, чтобы получить предпочтительный размер.В идеале, только делегат пользовательского интерфейса вашего компонента знает идеальный предпочтительный размер компонента.Как только вы установите размер префа самостоятельно, пользовательский интерфейс не будет запрашивать размер префа.

Для ясности см. Код Jcomonent.getPreferredSize ():

    if (isPreferredSizeSet()) {
        return super.getPreferredSize();
    }
    Dimension size = null;
    if (ui != null) {
        size = ui.getPreferredSize(this);
    }

Теперь, почему это зависит от компоновщика, потому что только некоторые макеты вызывают (используют) getPreferredSize () для вычисления.Например, для разметки потока используется размер префа, а для разметки границы

0 голосов
/ 24 февраля 2011

Метод setPreferredSize () не имеет побочных эффектов.

Как работы getPreferredSize () были описаны Сураем Чандраном.

Почему работала setPreferredSize (getPreferredSize ()), объяснил Па isло Эберманн.1005 *

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