Java JScrollPane 和 FlowLayout

Java JScrollPane and FlowLayout

昨天从本站的一位用户那里得到了如此大的帮助后,我决定在这里再问一个问题,希望你们能帮助我。 我想编写一个在 them.They 中具有组件的框架需要在 JPanel 上并且 JPanel 应该在 JScrollPane.

现在,问题是我需要为面板使用 FlowLayout,因为我不知道我的面板中会有多少组件。

如果我在 JScrollPane 中使用 FlowLayout,它不会创建新行,而只是水平移动,看起来在实际应用中超级奇怪。我想要的是,如果 window 结束,就会出现一条新线。

问题是如何解决这个问题。我不能放置 preferredSize,因为垂直 ScrollBar 不会比我放置 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);


    }   
}

I cant put a preferredSize, because the vertical ScrollBar will not go further than I put the preferredSize

正确,preferredSize() 需要在组件添加到面板时动态计算。 FlowLayout 的默认首选大小计算假定单行组件。

所以解决方案是使用不同的布局管理器。

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