我正在用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);
}
}
答案 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
字段在设置row
和column
之前初始化。
更改此
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)
这个问题在您希望实现的目标上有些模糊,但是,您不能在类初始化阶段(在构造函数之前运行)初始化数组,而是在构造函数中进行初始化。
这意味着rows
和cols
的值将在初始化数组本身之前设置。
以下内容演示了一种可能的工作流程,即使在构造类之后,该工作流程仍允许您更改数组的大小(从而更改按钮的数量),从而使其变得动态
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;
}
}
拥有rows
和cols
的setter没什么意义,因为如果要提供在之后更改数组的能力,则很难重建数组。创建类之后,使用setGridSize
并同时传入两个参数将使更新变得更加容易。否则,您可能应该放弃它们,而只将它们传递给构造函数