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

Java 如何在JScrollPane中获取水平滚动条,java,swing,jpanel,jscrollpane,jfreechart,Java,Swing,Jpanel,Jscrollpane,Jfreechart,我有一个面板布局问题,我似乎无法解决。我有以下代码: public class Test extends ApplicationFrame { public Test(String title) { super(title); JPanel jpanel = new JPanel(); jpanel.setPreferredSize(new Dimension(100 * 2, 300)); jpanel.setBackg

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

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);
    }
}
要创建以下布局,请执行以下操作:

当我拖动窗口的右侧并将其移动到红色的
JPanel
JScrollPane
时,我希望水平滚动条出现在
JScrollPane
上。但目前窗口只是缩小,没有显示水平滚动条。这可能吗


我想保留BorderLayout.WEST,因为我的用例是在没有足够大的图表填充整个窗口时,防止JFreeChart拉伸。

这是可以做到的。你可以申报三个JPanel。 一个JPanel是带边框布局的contentPanel。 设置为想要滚动条的JPanel的preferedSize和maximumSize 创建jscroolpane及其饰面: 伪代码:

JPanel contentPanel = new JPanel(new BorderLayuout());
JPanel jpanel1 = new JPanel(layout--);
JPanel jpanel2 = new JPanel(layout--);
jpanel2.setPreferredSize(..);
jpanel2.setMaximuSize(..);
JScrollPane jsp = new JScroolPane(jpanel2);
contentPanel.add(jpanel1,BorderLayout.WEST);
contentPanel.add(jsp,BorderLayout.CENTER);
this.getContentPane().add(contentPanel);
在我的示例中,滚动条位于中间。 如果你想找零钱

contentPanel.add(jsp,BorderLayout.WEST);
contentPanel.add(jpanel1,BorderLayout.CENTER);
没有必要使用
setPreferredSize()
,但这里最关键的一点是,所需的结果取决于封闭组件的首选尺寸。特别是,

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

  • JScrollPane
    的滚动条仅在视口大小小于内容大小时出现<代码>BorderLayout.WEST和
    BorderLayout.EAST
    不会更改,因此滚动条不会出现

调用
pack()
“使此
窗口的大小符合其子组件的首选大小和布局。”在下面的示例中,帧的大小在
pack()
之后被人为减小,以使滚动条出现<代码>网格布局
使两个面板大小相等。调整框架大小以查看效果

附录:如果您希望
图表面板
具有固定大小,请将其添加到
JPanel
;默认的
FlowLayout
使用首选大小

公共类ChartPanelTest{
专用静态最终整数N=64;
私有静态最终整数大小=400;
私有静态最终随机=新随机();
私有静态XYDataset createDataset(){
最终时间序列=新时间序列(“随机数据”);
当前日期=新日期();
对于(int i=0;i
WEST组件实际上并不是水平开始“压缩”的。在这种情况下,我不认为
BorderLayout
是您的friend@MadProgrammer你有没有关于哪个布局管理器更好的建议?我的直觉是
GridBagLayout
,但我还不确定它是否符合你的目的,我假设那些setXXSize只是为了演示:-)@kleopatra nope-完全不知道setXXSize是不能使用的。我在各个方面都是java ui新手。-1对于setXXSize-出于永远不这么做的原因,请参阅@trashgod的回答中的参考。这看起来就是我希望实现的目标。仍然需要翻译成真正的应用程序,但演示非常有用。谢谢这是给JFreeChart的,这也是一个不错的发现DWA能够成功地集成到实际应用程序中。再次感谢!杰出的也要考虑<代码> JSPLITANE < /代码>,如图所示。
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);
    }
}