Вопрос

Когда предпочтительный размер набора 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 в то время, когда называется getPreferredCrollableViewPortSize (), представляется произвольным значением (4225, 34) и PrefSizeset = false.

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

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

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

Это было полезно?

Решение

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

Другие советы

В awt (а затем качаться), Container.getPreferredSize() либо:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top