Java ScrollPane перекрывающееся содержимое - PullRequest
5 голосов
/ 23 сентября 2011

У меня, как я уверен, очень большая проблема для начинающих с моими JScrollPanes. Проблема заключается в том, что вертикальная полоса прокрутки перекрывает компоненты внутри закрытой панели (с правой стороны). Когда полоса прокрутки перекрывает выпадающий бит JComboBoxes, становится немного больно.

Я свел проблему к этому небольшому фрагменту - надеюсь, он проиллюстрирует проблему.

public class ScrollTest extends JFrame
{
    public ScrollTest()
    {
        super("Overlap issues!");
        JPanel panel = new JPanel();
        panel.setLayout(new GridLayout(100,0));

        for(int b=0;b<100;++b)
        {
            panel.add(new JButton("Small overlap here ->"));
        }

        JScrollPane scrollpane = new JScrollPane(panel);
        add(scrollpane);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) 
    {
        new ScrollTest();
    }
}

Сначала я посмотрел, но не увидел, решал ли кто-нибудь еще эту проблему. Извините, если это дубликат, и большое спасибо за любую помощь, кто-то может предложить java-newb, как я!

1 Ответ

4 голосов
/ 23 сентября 2011

Проблема в том, что по умолчанию для JScrollPane используется компоновка компонентов со значением по умолчанию JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, которое, в свою очередь, добавляет полосу прокрутки, не размечая компоненты снова.

В вашем примере вы знаете, что вам понадобится полоса прокрутки, поэтому измените ее, чтобы она всегда отображала полосу прокрутки

public class ScrollTest extends JFrame
{
    public ScrollTest()
    {
        super("Overlap issues!");
        JPanel panel = new JPanel();
        //Insets insets = panel.getInsets();
        //insets.set(5, 5, 5, 25);
        //insets.set(top, left, bottom, right);
        panel.setLayout(new GridLayout(100,0));

        for(int b=0;b<100;++b)
        {
            panel.add(new JButton("Small overlap here ->"));
        }

        JScrollPane scrollpane = new JScrollPane(panel);
        scrollpane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        add(scrollpane);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) 
    {
        new ScrollTest();
    }
}
...