二维对象阵列的深度副本



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

基本上,我创建了一个带有按钮的游戏场。这个游戏叫做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组件,因为它们没有实现可克隆接口。在我看来,你有两个选择:

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

  2. 编写自己的类来扩展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[][]阵列?

相关内容

  • 没有找到相关文章

最新更新