Java 如何使这个FlowLayout在其JSplitPane中包装?

Java 如何使这个FlowLayout在其JSplitPane中包装?,java,swing,layout-manager,Java,Swing,Layout Manager,我编写这个代码示例是为了说明我的程序存在的一个问题 我希望能够将JSplitPane的滑动条向左滑动,超出按钮边缘,压缩JPanel,并让FlowLayout将按钮包装到第二行 相反,JSplitPane不允许我将滑块移过屏幕上最右边的按钮,如果我调整整个JFrame的大小以强制压缩,按钮(我猜)只是从JPanel的右侧滑出,在滑块条下面(我猜,因为我显然看不到它们) 我做错了什么 import java.awt.*; import java.io.*; import java.util.*;

我编写这个代码示例是为了说明我的程序存在的一个问题

我希望能够将JSplitPane的滑动条向左滑动,超出按钮边缘,压缩JPanel,并让FlowLayout将按钮包装到第二行

相反,JSplitPane不允许我将滑块移过屏幕上最右边的按钮,如果我调整整个JFrame的大小以强制压缩,按钮(我猜)只是从JPanel的右侧滑出,在滑块条下面(我猜,因为我显然看不到它们)

我做错了什么

import java.awt.*;
import java.io.*;
import java.util.*;
import javax.swing.*;
public class Driver implements Runnable {
    public static void main(String[] args) {
        (new Driver()).run();
    }
    public void run() {
        try {
            go();
        } catch (Exception e) {
            e.printStackTrace();
            System.exit(-1);
        }
    }
    private void go() throws Exception {
        JFrame jframe = new JFrame("FlowLayoutTest");
        JPanel left = new JPanel();
        left.setBackground(Color.RED);
        left.setLayout(new BorderLayout());
        JPanel right = new JPanel();
        right.setBackground(Color.BLUE);
        right.setLayout(new BorderLayout());
        JSplitPane topmost =
            new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, left, right);
        jframe.setContentPane(topmost);
        JPanel bottomleft = new JPanel();
        bottomleft.setBackground(Color.GREEN);
        bottomleft.setLayout(new FlowLayout());
        left.add(bottomleft, BorderLayout.PAGE_END);
        for (int i = 0; i < 10; i++) {
            bottomleft.add(new JButton("" + i));
        }
        jframe.pack();
        jframe.setVisible(true);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
import java.awt.*;
导入java.io.*;
导入java.util.*;
导入javax.swing.*;
公共类驱动程序实现Runnable{
公共静态void main(字符串[]args){
(新驱动程序()).run();
}
公开募捐{
试一试{
go();
}捕获(例外e){
e、 printStackTrace();
系统退出(-1);
}
}
private void go()引发异常{
JFrame JFrame=新JFrame(“FlowLayoutTest”);
JPanel left=新的JPanel();
左。挫折背景(颜色。红色);
left.setLayout(新的BorderLayout());
JPanel right=新的JPanel();
右。挫折背景(颜色。蓝色);
右.setLayout(新的BorderLayout());
JSplitPane最上面的=
新的JSplitPane(JSplitPane.HORIZONTAL_SPLIT,左、右);
jframe.setContentPane(最上面);
JPanel bottomleft=新的JPanel();
左下角。背景(颜色。绿色);
setLayout(新的FlowLayout());
左。添加(左下角,边框布局。页面_结尾);
对于(int i=0;i<10;i++){
添加(新的JButton(“+i”);
}
jframe.pack();
jframe.setVisible(true);
jframe.setDefaultCloseOperation(jframe.EXIT_ON_CLOSE);
}
}
如果您添加此

bottomleft.setMinimumSize(new Dimension(0, 0));

在包装()之前,它会回流。但是,它不会重新打包边框布局,因此您将得到一条线,而不是两条线,其余部分将被截断。因此,调整大小后,您必须重新打包边框布局。如果省略边框布局,它将按照您的需要回流

也就是说,你应该避免像瘟疫一样的流动布局。Swing附带的大多数布局都很糟糕,但FlowLayout是最糟糕的问题之一。

如果您添加此选项

bottomleft.setMinimumSize(new Dimension(0, 0));

在包装()之前,它会回流。但是,它不会重新打包边框布局,因此您将得到一条线,而不是两条线,其余部分将被截断。因此,调整大小后,您必须重新打包边框布局。如果省略边框布局,它将按照您的需要回流

也就是说,你应该避免像瘟疫一样的流动布局。Swing附带的大多数布局都很糟糕,但FlowLayout是最糟糕的违规者之一


除了FlowLayout,是否还有其他布局管理器可以满足我的需求

应该有用


除了FlowLayout,是否还有其他布局管理器可以满足我的需求


应该可以工作。

问题是,我的程序在BorderLayout的其他部分中有实际的内容,但是删除它们不会影响“bottomleft”的行为,所以我的模型忽略了它们。除了FlowLayout之外,是否还有其他布局管理器可以满足我的要求?(从一行开始,换行到第二行,然后向上展开组件)“因此,在调整大小后,您必须重新打包边框布局。”在“调整大小后”,我将在何处插入一些代码以运行?”@Adam,FlowLayout没有问题。它是为特定的功能而设计的,使用起来非常简单。@Adam,FlowLayout只是为了在一条线上流动组件而设计的。它非常适合任何对话框,其中“确定”和“取消”按钮在BorderLayout的南面板中右对齐。如果你使用得当,每个布局都有它的用途。它从来没有被设计成一个多用途的布局,有几十个约束,为了让它正常工作,你需要考虑这些约束。GUI应该与布局管理器的适当组合一起构建。这并不意味着一刀切。问题是,我的程序在BorderLayout的其他部分中有实际的内容,但是删除它们不会影响“bottomleft”的行为,所以我的模型忽略了它们。除了FlowLayout之外,还有其他布局管理器可以完成我正在寻找的任务吗?(从一行开始,换行到第二行,然后向上展开组件)“因此,在调整大小后,您必须重新打包边框布局。”在“调整大小后”,我将在何处插入一些代码以运行?”@Adam,FlowLayout没有问题。它是为特定的功能而设计的,使用起来非常简单。@Adam,FlowLayout只是为了在一条线上流动组件而设计的。它非常适合任何对话框,其中“确定”和“取消”按钮在BorderLayout的南面板中右对齐。如果你使用得当,每个布局都有它的用途。它从来没有被设计成一个多用途的布局,有几十个约束,为了让它正常工作,你需要考虑这些约束。GUI应该与布局管理器的适当组合一起构建。这并不意味着一刀切。