如何在按钮上按下二维数组的新深度副本?
基本上,我创建了一个带有按钮的游戏场。这个游戏叫做sokoban,是一个谜。玩家使用固定地图上的箭头键(8x8个按钮)从一个按钮移动到另一个按钮。我想实现一个撤消函数。所以我想我只是在每次移动之前创建一个JButton数组的深层副本,并将其保存到堆栈中。所以当我按下undo按钮时,它会调用堆栈的pop函数。问题是,我需要在每次移动之前声明并初始化另一个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);
不幸的是,您通常无法克隆swing组件,因为它们没有实现可克隆接口。在我看来,你有两个选择:
-
在双循环中创建一个新的JButton,并将您设置的任何属性(如对齐、颜色等)复制到新的JBbutton
-
编写自己的类来扩展JButton并实现可克隆接口
第一种方法有点像黑客,不太健壮或可重复使用。第二种方法是更好的练习。在这种情况下,您必须定义深度复制应该如何发生,并确保所有相关属性都被复制。
你的想法是对的。你还不够深入。
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[][]
阵列?