如何在按钮上按下二维数组的新深度副本?
基本上我用按钮创建了一个游戏区域。这个游戏叫做推箱子,这是一个谜题。播放器在固定地图上使用箭头键从一个按钮移动到另一个按钮(8x8按钮)。 我想实现一个撤销功能。所以我认为我只是在每次移动之前创建JButton数组的深层副本并将其保存到堆栈中。因此,当我按下撤销按钮时,它会调用我的堆栈的弹出功能。问题是我需要声明并初始化另一个JButton [] [],我可以在每次移动之前保存游戏字段。因为我想要无限可能的动作而且还有动词,这对我来说似乎是不可能的。我不能声明和初始化不同的不同JButton [] []数组。关于如何解决这个问题的任何想法?
这就是我复制二维对象数组的方法:
JButton[][] tempArray = new JButton[jbArray.length][jbArray[0].length];
for (int i = 0; i < getJbArray().length; i++) {
for (int j=0;j<getJbArray()[0].length;j++) {
tempArray[i][j]=jbArray[i][j];
}
}
movesStack.push(tempArray);
答案 0 :(得分:2)
遗憾的是,您无法克隆swing组件,因为它们没有实现Cloneable接口。在我看来,你有两个选择:
在双循环中创建一个新的JButton并复制您设置为新JButton的任何属性(如对齐,颜色等)
编写自己的类,扩展JButton并实现Cloneable接口
第一种方式是某种程度的黑客攻击,而不是非常强大或可重用。第二种方式是更好的练习。在这种情况下,您必须定义深层副本应该如何发生,并确保复制所有相关属性。
答案 1 :(得分:0)
你有正确的想法。你还不够深入。
public JButton[][] copy(JButton[][] jbArray) {
JButton[][] tempArray = new JButton[jbArray.length][jbArray[0].length];
for (int i = 0; i < jbArray.length; i++) {
for (int j = 0; j < jbArray[0].length; j++) {
tempArray[i][j] = new JButton(jbArray[i][j].getText());
}
}
return tempArray;
}
您应该拥有一个用于设置JButton的模型,而不是复制JButton。也许是一个ModelClass[][]
数组?