2D对象数组的深复制

3

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

基本上,我创建了一个带有按钮的游戏场地。这个游戏叫做推箱子,是一种益智游戏。玩家通过箭头键在固定地图(8x8个按钮)上移动到另一个按钮。 我想要实现撤消功能。所以我想每次移动前都创建一个JButton数组的深拷贝,并将其保存到堆栈中。因此,当我按下撤消按钮时,它会调用我的堆栈的pop函数。问题是,我需要声明和初始化另一个JButton [] [],以便在每次移动之前保存游戏场地。由于我想要无限可能的移动和撤消,所以我觉得这似乎是不可能的。我无法声明和初始化无限不同的JButton [] []数组。有什么办法可以解决这个问题吗?

以下是如何复制2d对象数组:

    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);

也许你可以更简单:存储 操作 ,而不是 状态 。每次撤销步骤都还原该操作。 - rpax
2个回答

2

不幸的是,通常情况下你不能克隆Swing组件,因为它们没有实现Cloneable接口。我认为你有两个选择:

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

  2. 编写自己的类,继承JButton并实现Cloneable接口。

第一种方法有点像hack,不够健壮或可重用。第二种方法更好的做法。在这种情况下,您必须定义深度复制应该如何发生,并确保所有相关属性都被复制过来。


1
谢谢。我会尝试并回报。 - Quatsch
2
你的第一个方法起作用了!谢谢!我也尝试了第二个方法,但现在它会消耗太多时间。我没有想出如何做到这一点。 - Quatsch
1
我更喜欢使用构造函数复制而不是克隆。这是一种更好的实践。 - rpax

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;
    }

不要复制JButtons,你应该有一个模型来设置JButtons。也许是一个ModelClass[][]数组?


1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Quatsch
@K Erlandsson:我并不是为了提问者而设计这个类。我认为提问者正在问一个XY问题 - Gilbert Le Blanc
@Cappuccino90:不是的。使用模型来创建/更新JButtons,并保存模型的副本。 - Gilbert Le Blanc
1
@GilbertLeBlanc 如果我说错了什么,我很抱歉。我有这样的印象,你对我有点生气。我尝试了我所知道的所有方法,但我在Java方面还是个初学者。感谢您给我的提示。我将尝试根据您给我的提示自己解决问题,但可能需要几个小时。 - Quatsch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接