Java GridBagLayout:均匀分布的单元

Java GridBagLayout:均匀分布的单元,java,swing,layout-manager,gridbaglayout,Java,Swing,Layout Manager,Gridbaglayout,是否可以使用GridBagLayout管理器完全模拟GridBagLayout的行为 基本上,我有一个8x8网格,其中每个单元格的宽度和高度应该相同。GridLayout会自动执行此操作。但我想在网格中添加另一行和列,其大小与其他行和列不同。该行/列应该占用可能剩余的所有空间(因为可用大小不能平均分配到8个单元格中)。这是可能的,还是我必须使用不同的布局管理器 编辑 下面是我想要实现的简单图形,简化为4个单元格: 彩色单元格是我添加到实际网格(灰色)中的单元格,其中的单元格具有相同的高度和宽度

是否可以使用GridBagLayout管理器完全模拟GridBagLayout的行为

基本上,我有一个8x8网格,其中每个单元格的宽度和高度应该相同。GridLayout会自动执行此操作。但我想在网格中添加另一行和列,其大小与其他行和列不同。该行/列应该占用可能剩余的所有空间(因为可用大小不能平均分配到8个单元格中)。这是可能的,还是我必须使用不同的布局管理器

编辑 下面是我想要实现的简单图形,简化为4个单元格:

彩色单元格是我添加到实际网格(灰色)中的单元格,其中的单元格具有相同的高度和宽度
x
。因此网格的高度和宽度是
4*x
。我现在希望额外的单元格具有必要的宽度/高度(minimumSize)加上完整大小的剩余可用宽度/高度


如果更改了整个面板的大小,灰色网格单元应再次占据尽可能多的空间。

所有值均在
网格约束中设置

如果要固定8x8栅格,可以设置
ipadx
ipady

然后将新行/列的
weightx
weighty
值设置为
1.0
,并将
fill
设置为
FULL

额外的行/列将随着剩余的空间而扩展


如果您希望8x8栅格也能扩展,这将更加复杂。除了
weightx
weighty
值之外,您还可以调整
ipadx
ipady
值。或者为8x8网格制作一个面板,并在其中使用
GridLayout
。使用面板和附加行/列上的
GridBagLayout

将固定单元格的
GridBagConstraints
weightx
weighty
设置为
0
,将
填充设置为
NONE
。对于设置为
fill
BOTH
的浮动单元格,对于只应水平扩展的浮动单元格,将
weightx
设置为
1
,对于垂直扩展的单元格,将
weighty
设置为
1

单元格只有在有任何内容时才会展开,因此需要用某些内容填充单元格。我选择了
JLabel
s,并在固定单元格中为标签设置固定尺寸。调整尺寸时,需要重新计算尺寸,并调用
invalidate()
重新计算布局

以下是
w
x
h
网格的示例:

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class GridBag {
    public static void main(String[] args) {
        final JFrame f = new JFrame("Gridbag Test");
        final Container c = f.getContentPane();
        c.setLayout(new GridBagLayout());

        final Dimension dim = new Dimension(70, 70);
        final int w = 4;
        final int h = 4;
        final JLabel[] yfloating = new JLabel[w];
        final JLabel[] xfloating = new JLabel[h];
        final JLabel[][] fixed = new JLabel[w][h];

        // adding the vertically floating cells
        final GridBagConstraints gc = new GridBagConstraints();
        gc.fill = GridBagConstraints.BOTH;
        gc.weightx = 0.0;
        gc.weighty = 1.0;
        for(int i = 0; i < w; ++i) {
            yfloating[i] = new JLabel("floating " + i);
            yfloating[i].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            yfloating[i].setHorizontalTextPosition(JLabel.CENTER);
            yfloating[i].setVerticalTextPosition(JLabel.CENTER);
            gc.gridy = 0;
            gc.gridx = i+1;
            c.add(yfloating[i], gc);
        }

        // adding the horizontally floating cells
        gc.fill = GridBagConstraints.BOTH;
        gc.weightx = 1.0;
        gc.weighty = 0.0;
        for(int i = 0; i < w; ++i) {
            xfloating[i] = new JLabel("floating " + i);
            xfloating[i].setBorder(BorderFactory.createLineBorder(Color.BLACK));
            xfloating[i].setHorizontalTextPosition(JLabel.CENTER);
            xfloating[i].setVerticalTextPosition(JLabel.CENTER);
            gc.gridy = i+1;
            gc.gridx = 0;
            c.add(xfloating[i], gc);
        }

        // adding the fixed cells
        gc.fill = GridBagConstraints.NONE;
        gc.weightx = 0.0;
        gc.weighty = 0.0;
        for(int i = 0; i < w; ++i) {
            for(int j = 0; j < h; ++j) {
                fixed[i][j] = new JLabel("fixed " + i);
                fixed[i][j].setBorder(BorderFactory.createLineBorder(Color.BLACK));
                fixed[i][j].setMaximumSize(dim);
                fixed[i][j].setMinimumSize(dim);
                fixed[i][j].setPreferredSize(dim);

                gc.gridx = i+1;
                gc.gridy = j+1;
                c.add(fixed[i][j], gc);
            }
        }

        c.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                final Component comp = e.getComponent();
                final int newSize = Math.min(comp.getHeight() / h, comp.getWidth() / w);
                final Dimension newDim = new Dimension(newSize, newSize);
                for(int i = 0; i < w; ++i) {
                    for(int j = 0; j < h; ++j) {
                        fixed[i][j].setMaximumSize(newDim);
                        fixed[i][j].setMinimumSize(newDim);
                        fixed[i][j].setPreferredSize(newDim);
                    }
                }
                comp.invalidate();
            }
        });

        f.pack();
        f.setVisible(true);
    }
}
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Container;
导入java.awt.Dimension;
导入java.awt.GridBagConstraints;
导入java.awt.GridBagLayout;
导入java.awt.event.ComponentAdapter;
导入java.awt.event.ComponentEvent;
导入javax.swing.BorderFactory;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
公共类垃圾箱{
公共静态void main(字符串[]args){
最终JFrame f=新JFrame(“网格袋试验”);
最终容器c=f.getContentPane();
c、 setLayout(新的GridBagLayout());
最终尺寸尺寸=新尺寸(70,70);
最终int w=4;
最终int h=4;
最终JLabel[]yfloating=新JLabel[w];
最终JLabel[]xfloating=新JLabel[h];
最终JLabel[][]固定=新JLabel[w][h];
//添加垂直浮动单元格
final GridBagConstraints gc=新的GridBagConstraints();
gc.fill=GridBagConstraints.BOTH;
gc.weightx=0.0;
gc.weighty=1.0;
对于(int i=0;iMigLayout layout = new MigLayout(
        "",         // Layout Constraints
        "[10][10][10][10]", // Column constraints
        "[10][10][10][10]");  // Row constraints