2015-06-27 108 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/)。 –