GridLayout 中的按钮,不可调整大小

Buttons in GridLayout, non resize

我在使用 GridLayout 时遇到问题,因为我知道我需要这个只是为了解决我的问题:我需要这个矩阵面板(在 GridLayout 中制作)不可调整大小。就像一个完整的正方形,例如,在中间并且无法调整大小。我做了很多研究工作,但找不到答案。

public class  ButtonsMatrix extends JButton {

    private int[][] fModel;
    private  int fX;
    private  int fY;

    public ButtonsMatrix(int x, int y, int[][] model) {

        fX = x;
        fY = y;
        fModel = model;

        addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                fModel[fX][fY] = fModel[fX][fY] == 1 ? 0 : 1;
                updateNameFromModel();
            }
        });
        updateNameFromModel();
    }

    private void updateNameFromModel() {
        setText(String.valueOf(fModel[fX][fY]));
    }

    public static void main(String[] args) {

        int dim=10;
        int matrix[][] = new int[10][10];

        JFrame f = new JFrame("Window containing a matrix");
        JPanel p = new JPanel();
        JPanel extra = new JPanel(new FlowLayout());
        extra.add(p);
        p.setLayout(new GridLayout(dim, dim));

        for (int r = 0; r < dim; r++){
            for (int c = 0; c < dim; c++){
                ButtonsMatrix button= new ButtonsMatrix(r, c, matrix);
                p.add(button);
            }
        }

        f.add(p);
        f.pack();
        f.setVisible(true);
    }
}

将带有 GridLayout 的面板放在另一个带有 GridBagLayout.

的面板中

如果它是唯一的组件并且没有添加 GridBagConstraints,它将居中并且其大小将保持不变,无论分配给带有网格包布局的面板的大小如何。

编辑

以上代码将包含按钮网格布局的面板添加到 main 方法中定义的 extra 面板(它有一个 FlowLayout)。这将 使按钮矩阵面板保持其首选大小。

代码的问题在于此后它会忽略 extra 面板并将 p 面板(带有按钮的网格布局)直接添加到带有 (默认)BorderLayout。这样做会导致 p 面板被添加到边框布局的 CENTER 中,这将拉伸组件以填充可用的宽度和高度。

要解决这个问题,只需更改:

f.add(p);

收件人:

f.add(extra);