2d对象数组的深层副本

时间:2015-06-27 17:31:03

标签: java arrays multidimensional-array deep-copy

如何在按钮上按下二维数组的新深度副本?

基本上我用按钮创建了一个游戏区域。这个游戏叫做推箱子,这是一个谜题。播放器在固定地图上使用箭头键从一个按钮移动到另一个按钮(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);

2 个答案:

答案 0 :(得分:2)

遗憾的是,您无法克隆swing组件,因为它们没有实现Cloneable接口。在我看来,你有两个选择:

  1. 在双循环中创建一个新的JButton并复制您设置为新JButton的任何属性(如对齐,颜色等)

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

  3. 第一种方式是某种程度的黑客攻击,而不是非常强大或可重用。第二种方式是更好的练习。在这种情况下,您必须定义深层副本应该如何发生,并确保复制所有相关属性。

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