Java JScrollPane和FlowLayout

Java JScrollPane和FlowLayout,java,swing,jscrollpane,flowlayout,Java,Swing,Jscrollpane,Flowlayout,昨天我从这个网站上的许多用户那里得到了很大的帮助,我决定在这里问另一个问题,希望你们能帮助我。 我想编码一个包含组件的框架。它们需要位于JPanel上,而JPanel应该位于JScrollPane中 现在,问题是我需要为面板使用流程布局,因为我不知道面板中将有多少组件 如果我在JScrollPane内部使用FlowLayout,它不会创建新行,而是水平移动,这在实际应用程序中看起来非常奇怪。我想要的是,如果窗口即将结束,一条新的线将靠近 问题是如何解决这个问题。我不能输入preferredSiz

昨天我从这个网站上的许多用户那里得到了很大的帮助,我决定在这里问另一个问题,希望你们能帮助我。 我想编码一个包含组件的框架。它们需要位于JPanel上,而JPanel应该位于JScrollPane

现在,问题是我需要为面板使用流程布局,因为我不知道面板中将有多少组件

如果我在JScrollPane内部使用FlowLayout,它不会创建新行,而是水平移动,这在实际应用程序中看起来非常奇怪。我想要的是,如果窗口即将结束,一条新的线将靠近

问题是如何解决这个问题。我不能输入preferredSize,因为垂直滚动条不会比我输入的preferredSize更进一步,所以我真的不知道该怎么做…也许改变布局?我将感谢任何帮助

问题的示例代码:

public class scroller extends JFrame {

    Container c;
    JPanel p;
    JScrollPane pane;
    JButton button1;
    JButton button2;
    JButton button3;
    JButton button4;

    public scroller() {
        c = getContentPane();
        c.setLayout(new BorderLayout());
        p = new JPanel();
        p.setLayout(new FlowLayout());
        pane = new JScrollPane(p);
        button1 = new JButton("OK1");
        p.add(button1);
        button2 = new JButton("OK2");
        p.add(button2);
        button3 = new JButton("OK3");
        p.add(button3);
        button4 = new JButton("OK4");
        p.add(button4);
        p.setVisible(true);
        c.add(pane,BorderLayout.CENTER);

    }

    public static void main(String[] args) {
        scroller window = new scroller();
        window.setSize(200,200);
        window.setVisible(true);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);


    }   
}
我不能输入preferredSize,因为垂直滚动条不会比我输入的preferredSize更远

正确,当组件添加到面板时,需要动态计算preferredSize()。FlowLayout的默认首选尺寸计算假定为一行组件

因此,解决方案是使用不同的布局管理器


扩展FlowLayout并覆盖首选尺寸计算,以便在组件换行到新行时提供首选宽度和高度。

已搜索是否可以禁用水平滚动,并且组件只适合垂直行?我认为另一个答案非常适合我的问题。我想WrapLayout()工作得很好。我之前也试过了,但是我犯了一些错误,这就是为什么我没有工作。无论如何,还是要感谢你的意见!