二维对象数组的深拷贝

Deep copies of 2d object array

如何在按下按钮时制作二维数组的新深拷贝?

基本上我创建了一个带有按钮的游戏区域。该游戏称为推箱子,是一个谜题。玩家在固定地图(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);

你的想法是正确的。你还不够深入。

    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[][] 数组?

不幸的是,一般情况下您不能克隆 swing 组件,因为它们没有实现 Cloneable 接口。在我看来,您有两个选择:

  1. 在你的双循环中创建一个新的 JButton 并将你设置的任何属性(如对齐方式、颜色等)复制到新的 JButton

  2. 编写自己的 class 扩展 JButton 并实现 Cloneable 接口

第一种方法有点乱,不是很健壮或可重用。第二种方法是更好的练习。在这种情况下,您必须定义深层复制应该如何发生,并确保复制所有相关属性。