Как использовать JScrollpane в ЦЕНТРЕ BorderLayout - PullRequest
2 голосов
/ 07 февраля 2012

У меня есть следующий код:

    package example;

    import java.awt.BorderLayout;
    import java.awt.FlowLayout;

    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;

    public class ScrollingExample extends JFrame
    {
        private static final long serialVersionUID = 1L;

        public static void main(String[] args)
        {
            ScrollingExample scrollingExample = new ScrollingExample();
            scrollingExample.go();
        }

        private void go()
        {
            JPanel topPanel = new JPanel();
            topPanel.add(new JLabel("boo"));

            JPanel mainPanel = new JPanel();
            JPanel mainInnerPanel = makeMainInnerPanel();

            JScrollPane scrollPane = new JScrollPane(mainInnerPanel);
            mainPanel.add(scrollPane);
            add(topPanel, BorderLayout.NORTH);
            add(mainPanel, BorderLayout.CENTER);

            pack();
            setVisible(true);
        }

        private JPanel makeMainInnerPanel()
        {
            JPanel row1 = makeHorizontalPanel("one", "two", "three", "four", "five");
            JPanel row2 = makeHorizontalPanel("six", "seven", "eight");
            JPanel row3 = makeHorizontalPanel("nine", "ten", "eleven");
            JPanel mainInnerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
            mainInnerPanel.add(row1);
            mainInnerPanel.add(row2);
            mainInnerPanel.add(row3);
            return mainInnerPanel;
        }

        private JPanel makeHorizontalPanel(String ... labelValues)
        {
            JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
            for (String s : labelValues)
            {
                JLabel label = new JLabel(s);
                panel.add(label);
            }
            return panel;
        }
    }

Когда я отображаю его, он масштабирует себя, чтобы показать все метки; когда я изменяю размер окна, я не могу отобразить полосы прокрутки.

Когда я получу эту работу, я хочу создать панель, которая содержит JTabbedPane и пару кнопок, и я хочу, чтобы в THAT были полосы прокрутки, если пользователь изменяет размеры окна так, что некоторая его часть не может быть видна. Если для ответа на этот вопрос нужно что-то дополнительное или другое, упоминание будет приветствоваться.

Ответы [ 3 ]

5 голосов
/ 07 февраля 2012

Вам необходимо разрешить увеличение или уменьшение области прокрутки при изменении размера окна.

Нет необходимости в "главной панели".

Просто используйте:

// add(mainPanel, BorderLayout.CENTER);
add(scrollPane, BorderLayout.CENTER);
3 голосов
/ 07 февраля 2012
import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class ScrollingExample extends JFrame
{
    private static final long serialVersionUID = 1L;

    public static void main(String[] args)
    {
        ScrollingExample scrollingExample = new ScrollingExample();
        scrollingExample.go();
    }

    private void go()
    {
            setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        JPanel topPanel = new JPanel();
        topPanel.add(new JLabel("boo"));

        JPanel mainPanel = new JPanel(new BorderLayout());
        JPanel mainInnerPanel = makeMainInnerPanel();

        JScrollPane scrollPane = new JScrollPane(mainInnerPanel);
        mainPanel.add(scrollPane);
        add(topPanel, BorderLayout.NORTH);
        add(mainPanel, BorderLayout.CENTER);

        pack();
        setVisible(true);
    }

    private JPanel makeMainInnerPanel()
    {
        JPanel row1 = makeHorizontalPanel("one", "two", "three", "four", "five");
        JPanel row2 = makeHorizontalPanel("six", "seven", "eight");
        JPanel row3 = makeHorizontalPanel("nine", "ten", "eleven");
        JPanel mainInnerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        mainInnerPanel.add(row1);
        mainInnerPanel.add(row2);
        mainInnerPanel.add(row3);
        return mainInnerPanel;
    }

    private JPanel makeHorizontalPanel(String ... labelValues)
    {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        for (String s : labelValues)
        {
            JLabel label = new JLabel(s);
            panel.add(label);
        }
        return panel;
    }
}
3 голосов
/ 07 февраля 2012

JPanel имеет по умолчанию FlowLayout , вы должны точно определить (если вы хотите изменить LayoutManager ), JComponent реализовал различные LayoutManager, например. JFrame / JDialog / JWindow (из Java5) имеет Borderlayout по умолчанию

mainPanel.setLayout(new Borderlayout(10, 10))
...