JPanel Предпочитаемый размер не установлен - PullRequest
1 голос
/ 29 апреля 2011

Когда предпочтительный размер набора JPanel, если вы не установили его явно?

У меня есть следующий код:

private static class ScrollableJPanel extends JPanel implements Scrollable {
    @Override
    public Dimension getPreferredScrollableViewportSize() {
                 return getPreferredSize();
    }
            .
            .
            .
}

и этот код:

    myPanel = new ScrollableJPanel();
            // Add a bunch of controls to the panel.
    final JScrollPane scroll = new JScrollPane(myPanel);
    scroll.setAutoscrolls(true);
    scroll.setHorizontalScrollBarPolicy(
        ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

Однако предпочтительный размер myPanel во время вызова getPreferredScrollableViewportSize ()кажется произвольным значением (4225, 34), и prefSizeSet ​​= false.

Согласно документации Java , это разумный способ определить этот метод.Однако фактический размер myPanel намного превышает 34 пикселя, поэтому порт просмотра слишком мал.

Что я здесь не так делаю?Должен ли я установить предпочтительный размер myPanel явно?Я попробовал это, но я хочу использовать фактический размер, определенный менеджером макета, а не просто делать предположение, которое будет переопределено позже.

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

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

В AWT (а затем в Swing) Container.getPreferredSize() либо:

  • возвращает размер, явно заданный setPreferredSize(),
  • , либо размер, рассчитанный по LayoutManagerесли setPreferredSize() не был вызван явно

Следовательно, то, что getPreferredSize() возвращает в значительной степени, зависит от того, какой LayoutManager вы используете для своего ScrollableJPanel.

Имейте в виду, что большинствоLayoutManager s будет использовать getPreferredSize() на всех прямых потомках Container, которым был вызван getPreferredSize().Это рекурсивный процесс (если дети сами имеют детей) и может включать несколько различных LayoutManager s.

3 голосов
/ 29 апреля 2011

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

...