JPanel предпочитает размер не установлен
-
26-10-2019 - |
Вопрос
Когда предпочтительный размер набора 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
.
Имейте в виду, что большинство LayoutManager
S будет использовать getPreferredSize()
На всех прямых детях Container
на которой getPreferredSize()
назывался. Это рекурсивный процесс (если у детей есть дети), и может включать несколько разных LayoutManager
с