如何从Java中的另一个类更改数组的大小

时间:2018-08-16 20:20:25

标签: java swing user-interface

我正在用Java进行一些GUI设计,我想从另一个类中更改2D Jbuttons数组的大小。更改大小,将更改框架上添加的按钮数量。我尝试使用实例变量和get()方法来执行此操作,但是,它似乎不适用于按钮数组。 我只给出了以下相关代码:

public class Minefield extends JFrame{
    private JFrame frame;
    private JPanel panel;
    private int ROWS;
    private int COLS;
    private JButton[][] grid = new JButton[getRows()][getCols()];

    public Minefield(int rows, int cols){
        super("Minesweeper 1");

        setRows(rows);
        setCols(cols);

        for(int i = 0; i < grid.length; i++){
            for(int j = 0; j < grid[i].length; j++){
                grid[i][j] = new JButton("[" + i + "][" + j + "]");
                panel.add(grid[i][j]);
                grid[i][j].addActionListener(handler);
            }
            container.add(panel);
        }
    }

    public void setRows(int rows){
        ROWS = rows;
    }

    public int getRows(){
        return ROWS;
    }

    public void setCols(int cols){
        COLS = cols;
    }

    public int getCols(){
        return COLS;
    }
}

这是我要从中运行GUI的测试器类,在其中我无法弄清楚如何更改数组

public class MinefieldTest{
    public static void main(String[] args){

        Minefield minefield = new Minefield(4,2);
        minefield.setVisible(true);

    }
}

3 个答案:

答案 0 :(得分:0)

只需尝试:

public class Minefield extends JFrame{
    private JFrame frame;
    private JPanel panel;
    private int ROWS;
    private int COLS;
    private JButton[][] grid;

    public Minefield(int rows, int cols){
        super("Minesweeper 1");
        grid = new JButton[rows][cols];
        ...
    }

否则不能更改数组的大小,因为它的大小为final,因此是常量。因此,您班上的二传手也没有用。数组的静态大小也是人们使用诸如列表之类的数据结构的原因,该结构可以扩展或减小。

一种替代方法是:

ArrayList<ArrayList<JButton>> grid = new ArrayList<>();

使用二维list,您可以达到相同的效果,但是速度可能会稍慢一些,但是对于您的游戏来说,这已经足够了。

答案 1 :(得分:0)

grid字段在设置rowcolumn之前初始化。

更改此

private JButton[][] grid = new JButton[getRows()][getCols()];

public Minefield(int rows, int cols){
    super("Minesweeper 1");

    setRows(rows);
    setCols(cols);

    for(int i = 0; i < grid.length; i++){
        for(int j = 0; j < grid[i].length; j++){
            grid[i][j] = new JButton("[" + i + "][" + j + "]");
            panel.add(grid[i][j]);
            grid[i][j].addActionListener(handler);
        }
        container.add(panel);
    }
}

收件人:

private JButton[][] grid;

public Minefield(int rows, int cols){
    super("Minesweeper 1");

    setRows(rows);
    setCols(cols);

    grid = new JButton[getRows()][getCols()];


    for(int i = 0; i < grid.length; i++){
        for(int j = 0; j < grid[i].length; j++){
            grid[i][j] = new JButton("[" + i + "][" + j + "]");
            panel.add(grid[i][j]);
            grid[i][j].addActionListener(handler);
        }
        container.add(panel);
    }
}

答案 2 :(得分:0)

这个问题在您希望实现的目标上有些模糊,但是,您不能在类初始化阶段(在构造函数之前运行)初始化数组,而是在构造函数中进行初始化。

这意味着rowscols的值将在初始化数组本身之前设置。

以下内容演示了一种可能的工作流程,即使在构造类之后,该工作流程仍允许您更改数组的大小(从而更改按钮的数量),从而使其变得动态

public class Minefield extends JFrame {

    private JPanel panel;
    private int rows;
    private int cols;
    private JButton[][] grid;

    public Minefield(int rows, int cols) {
        super("Minesweeper 1");

        setGridSize(cols, rows);
    }

    public void setGridSize(int cols, int rows) {
        container.removeAll();
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                grid[i][j] = new JButton("[" + i + "][" + j + "]");
                panel.add(grid[i][j]);
                grid[i][j].addActionListener(handler);
            }
            container.add(panel);
        }
        container.revalidate();
        container.repaint();
    }

    public int getRows() {
        return rows;
    }

    public int getCols() {
        return cols;
    }
}

拥有rowscols的setter没什么意义,因为如果要提供在之后更改数组的能力,则很难重建数组。创建类之后,使用setGridSize并同时传入两个参数将使更新变得更加容易。否则,您可能应该放弃它们,而只将它们传递给构造函数