GridLayout中的按钮,非调整大小

时间:2018-05-26 14:38:38

标签: java swing layout-manager grid-layout

我遇到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);
    }
}

1 个答案:

答案 0 :(得分:1)

将具有GridLayout的面板放在另一个具有 GridBagLayout 的面板中。

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

修改

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

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

要解决此问题,只需更改:

f.add(p);

要:

f.add(extra);