如何在JScrollPane中获取水平滚动条

Gav*_*ler 5 java swing jfreechart jpanel jscrollpane

我有一个面板布局问题,我似乎无法解决.我有以下代码:

public class Test extends ApplicationFrame {
    public Test(String title) {
        super(title);

        JPanel jpanel = new JPanel();
        jpanel.setPreferredSize(new Dimension(100 * 2, 300));
        jpanel.setBackground(new Color(0xFF0000));

        JScrollPane scrollPane = new JScrollPane(jpanel);
        scrollPane.setBackground(new Color(0xFF0000));
        scrollPane.getViewport().setPreferredSize(new Dimension(100 * 2, 300));

        this.add(scrollPane, BorderLayout.WEST);
        this.setPreferredSize(new Dimension(500, 500));
    }

    public static void main(String args[]) {
        Test test = new Test("Layout Test");
        test.pack();
        RefineryUtilities.centerFrameOnScreen(test);
        test.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

创建以下布局:

在此输入图像描述

当我拖动窗口的右侧并将其移动到红色JPanelJScrollPane,我想水平滚动条出现在JScrollPane.但是目前窗口只是收缩而没有显示水平滚动条.这可能吗?

我想保留,BorderLayout.WEST因为我的用例就是当我没有足够大的图表来填充整个窗口时保持JFreeChart不会拉伸.

tra*_*god 7

许多原因不使用setPreferredSize(),但这里的关键原因是所需的结果取决于封闭组件的优选尺寸.特别是,

  • ChartPanel具有FlowLayout指定的默认值JPanel,但图表忽略此值并调整以填充可用空间; 您可以覆盖getPreferredSize()以选择任何所需的初始几何体.

  • JScrollPane仅当视口的大小小于内容的大小时,才会显示滚动条.BorderLayout.WEST并且BorderLayout.EAST不要更改,因此滚动条永远不会出现.

调用pack()"会Window使其大小适合其子组件的首选大小和布局." 在下面的示例中,pack()为了使滚动条出现,人为地减少了框架的大小.GridLayout导致两个面板的大小相等.调整框架大小以查看效果.

附录:如果你想要一个ChartPanel固定的大小,添加到一个JPanel; 默认值FlowLayout使用首选大小.

图片

public class ChartPanelTest {

    private static final int N = 64;
    private static final int SIZE = 400;
    private static final Random random = new Random();

    private static XYDataset createDataset() {

        final TimeSeries series = new TimeSeries("Random Data");
        Day current = new Day();
        for (int i = 0; i < N; i++) {
            series.add(current, random.nextGaussian());
            current = (Day) current.next();
        }
        return new TimeSeriesCollection(series);
    }

    private static JFreeChart createChart(final XYDataset dataset) {
        JFreeChart chart = ChartFactory.createTimeSeriesChart(
            "Test", "Day", "Value", dataset, false, false, false);
        return chart;
    }

    public static void main(String[] args) {

        JFrame f = new JFrame();
        f.setLayout(new GridLayout(1, 0));
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JFreeChart chart = createChart(createDataset());
        f.add(new JScrollPane(new JPanel() {

            {
                setBackground(Color.red);
            }

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(SIZE, SIZE);
            }
        }));
        f.add(new ChartPanel(chart) {

            @Override
            public Dimension getPreferredSize() {
                return new Dimension(SIZE, SIZE);
            }
        });
        f.pack();
        f.setSize(2 * (SIZE - N), SIZE - N);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}
Run Code Online (Sandbox Code Playgroud)