在保持setPreferredSize()大小的同时垂直连接JPanel

时间:2014-05-14 05:29:13

标签: java swing jpanel layout-manager gridbaglayout

我想要一个"列表"连接的JPanel s,其中每个单元格具有相应的JPanel的大小。例如:

enter image description here

在此示例中,Panel1的setPreferredSize小于Panel2的setPreferredSize。连接JPanels的结果是上图。

我考虑过制作一个网格布局,但我找不到一种方法来保持每个小组setPreferredSize的维度...现在我所拥有的是单元格之间的重量比... < / p>

    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);

2 个答案:

答案 0 :(得分:1)

  

我只想垂直连接JPanels并保持其setPreferredSize()大小

GridBagLayout将尊重组件的首选大小。

不要使用&#34; fill&#34;约束

答案 1 :(得分:1)

而不是古老的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();
    }
}

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