Горизонтальная полоса прокрутки не работает для JScrollPane - PullRequest
0 голосов
/ 09 мая 2018

Это мой плагин к приложению с Miglayout:

enter image description here

Это код инициализации MigLayout, макет занимает 100% пространства главной панели:

resPanel.setLayout(new BoxLayout(resPanel, BoxLayout.Y_AXIS));
mainPanel.setLayout(new MigLayout("", "[][grow][grow][]", "[][][][grow]"));
mainPanel.add(new JLabel("Class expression"), "wrap");
mainPanel.add(owlDescriptionEditor, "growx,span 3");
mainPanel.add(calcButton, "wrap");
mainPanel.add(new JLabel("Definitions found"), "span 2");
mainPanel.add(new JLabel("Target signature"), "span 2,wrap");
JScrollPane jsp = new JScrollPane(resPanel);
mainPanel.add(jsp, "growy, growx, span 2");
jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
mainPanel.add(new JScrollPane(deltaList), "growx,growy,span 2");

Проблема не в том, что горизонтальная полоса прокрутки в левом списке работает, это JPanel с BoxLayout, хотя я вызываю для него setVerticalScrollBarPolicy. JPanel динамически заполняется этим циклом:

static void updateList(JPanel panel, Collection<OWLClassExpression> list) {
    panel.removeAll();
    for (int i = 0; i < 3; i++) {
        for (OWLClassExpression p : list) {
            String name = ((OWLNamedObject) p).getIRI().getShortForm();
            JEditorPane jep = new JEditorPane("text/html", name+"QWQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ");
            jep.setPreferredSize(new Dimension(200,20));
            jep.setEditable(false);
            jep.setOpaque(false);
            panel.add(jep);
        }
    }
    panel.add( Box.createVerticalStrut(400) );
}

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

1 Ответ

0 голосов
/ 09 мая 2018
jep.setPreferredSize(new Dimension(200,20));

Не указывайте предпочтительные размеры.

Каждый компонент dynamcially определяет свой собственный предпочтительный размер на основе свойств компонента (текст, шрифт и т. Д.).

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

Также после того, как вы закончите добавлять все компоненты на панель, вам нужно использовать:

panel.revalidate();

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

...