Горизонтальная полоса прокрутки не работает для JScrollPane

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

введите здесь описание изображения

Это код инициализации 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) );
}

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


person Stepan Yakovenko    schedule 09.05.2018    source источник
comment
Чтобы быстрее получить помощь, опубликуйте минимально воспроизводимый пример или Короткий, автономный, правильный пример. Было бы лучше, если бы MCVE/SSCCE использовали только макеты J2SE.   -  person Andrew Thompson    schedule 09.05.2018


Ответы (1)


jep.setPreferredSize(new Dimension(200,20));

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

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

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

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

panel.revalidate();

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

person camickr    schedule 09.05.2018