Java 垂直连接JPanel,同时保持其setPreferredSize()大小

Java 垂直连接JPanel,同时保持其setPreferredSize()大小,java,swing,jpanel,layout-manager,gridbaglayout,Java,Swing,Jpanel,Layout Manager,Gridbaglayout,我想要一个串联的JPanels的“列表”,其中每个单元格都有相应的JPanel大小。例如: 在本例中,Panel1的setPreferredSize小于Panel2的setPreferredSize。连接JPanel的结果是上图 我想制作一个gridbaglayout,但是我找不到一种方法来保持每个面板的setPreferredSize的尺寸。。。现在我得到的是细胞之间的重量比 gridBagLayout = new GridBagLayout(); gridBagLayout

我想要一个串联的
JPanel
s的“列表”,其中每个单元格都有相应的
JPanel
大小。例如:

在本例中,Panel1的setPreferredSize小于Panel2的setPreferredSize。连接JPanel的结果是上图

我想制作一个gridbaglayout,但是我找不到一种方法来保持每个面板的
setPreferredSize
的尺寸。。。现在我得到的是细胞之间的重量比

    gridBagLayout = new GridBagLayout();
    gridBagLayout.columnWidths = new int[]{0, 0};
    gridBagLayout.rowHeights = new int[]{0, 0, 0};
    gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
    gridBagLayout.rowWeights = new double[]{1.0, 9.0, Double.MIN_VALUE};
    setLayout(gridBagLayout);

    p1 = new Panel1();
    p2 = new Panel2();      
    GridBagConstraints gbc_p1 = new GridBagConstraints();
    gbc_p1.insets = new Insets(0, 0, 0, 0);
    gbc_p1.fill = GridBagConstraints.BOTH;
    gbc_p1.gridx = 0;
    gbc_p1.gridy = 0;
    add(p1, gbc_p1);



    GridBagConstraints gbc_p2 = new GridBagConstraints();
    gbc_p2.fill = GridBagConstraints.BOTH;
    gbc_p2.gridx = 0;
    gbc_p2.gridy = 1;
    add(p2, gbc_p2);
我只想垂直连接一个接一个的JPanel,并保持它们的setPreferredSize()大小

GridBagLayout将考虑组件的首选大小


只是不要使用“填充”约束。

而不是旧的
GridBaglayout
我对
BoxLayout
有一个建议

public class PanelTower extends JFrame {

    int length = 4 ;

    public PanelTower() {

        JPanel towerPanel = new JPanel();
        towerPanel.setLayout(new BoxLayout(towerPanel, BoxLayout.Y_AXIS));

        JPanel[] panels = new JPanel[length];
        for (int i = 0; i < length; i++) {
            panels[i] = new JPanel();
            panels[i].setBackground(new Color((float)Math.random(), (float)Math.random(), (float)Math.random()));
            Dimension dims = new Dimension((i+1)*50, (i+1)*50);
            panels[i].setPreferredSize(dims);
            panels[i].setMinimumSize(dims);
            panels[i].setMaximumSize(dims);
            towerPanel.add(panels[i]);
        }

        add(towerPanel);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {

        new PanelTower();
    }
}
公共类PanelTower扩展JFrame{
整数长度=4;
公共电视塔(){
JPanel towerPanel=新的JPanel();
towerPanel.setLayout(新的BoxLayout(towerPanel,BoxLayout.Y_轴));
JPanel[]面板=新JPanel[长度];
for(int i=0;i

我不确定您的具体要求,但这应该很容易修改(我从您的示例中怀疑宽度是恒定的,只有高度变化)。

我不清楚功能。你想有一个面板及其大小的列表,并用它沿一个方向以任意顺序连接任意数量的面板?@user1803551我只想垂直连接一个接一个的JPanel,并保持它们的setPreferredSize()大小。我会更改标题如果你不想影响组件的宽度或高度,更改行/列权重或
fill
属性,并将
GridBagConstraints
gridwidth
属性设置为
GridBagConstraints.remains
…或使用SwingLab的SwingX库中的
VerticalLayout
。@MadProgrammer我应该将行/列权重或
fill
更改为什么?我试图删除
fill
行,但它似乎将我的面板大小调整为10x10像素。当我删除rowWeights/columnWeights行时也发生了同样的事情。但这不是你想要的吗?这是
GridBagLayout
尊重面板的首选尺寸