2015-06-27 135 views
3

如何在按钮上按下2维数组的新深度副本?2d对象数组的深层副本

基本上我用按钮创建了一个游戏场。这场比赛被称为推箱子,这是一个谜题。玩家使用固定地图上的箭头键(8x8按钮)从一个按钮移动到另一个按钮。 我想实现一个撤消功能。所以我认为我只是在每次移动之前创建一个JButton数组的深层副本并将其保存到堆栈中。所以当我按下撤消按钮时,它会调用我的堆栈的弹出功能。问题是我需要声明并初始化另一个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); 
+0

也许你可以更简单:存储_actions_,而不是_state_。每撤消一步,恢复操作。 – rpax

回答

2

不幸的是,你不能克隆摆动组件,因为它们没有实现Cloneable接口。当我看到它,你有两个选择:

  1. 你的双循环内创建一个新的JButton,并复制任何属性(比如对齐,颜色等),已设置的新的JButton

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

第一种方式是有点一个黑客,而不是非常强大的或可重复使用。第二种方法是更好的做法。在这种情况下,您必须定义深度副本应该如何发生,并确保复制所有相关属性。

+0

谢谢。我会试一试并回报。 – Cappuccino90

+1

你的号码1做到了!谢谢!我试过nr。 2,但现在会消耗太多时间。我没有弄清楚如何去做。 – Cappuccino90

+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不同,您应该有一个用于设置JButton的模型。也许ModelClass[][]阵列?

+5

原始按钮的所有其他属性/操作/样式如何? – Codebender

+0

我必须同意Abishek Manoharan。我的每个按钮都有不同的图标和名称。你认为你可以改变你的答案吗? – Cappuccino90

+0

@K Erlandsson:我没有为OP设计课程。我认为OP正在问一个[XY问题](http://xyproblem.info/)。 –