2015-05-19 485 views
0

我正嘗試使用JavaFX創建一個國際象棋遊戲,並且我發現使匹配歷史記錄相當棘手,在成功打印歷史記錄後,我試圖添加posible返回某些棋盤狀態。JavaFX覆蓋對象

我試過這種方法,但它不會工作: 第一部分是從我的控制器代碼段初始化函數

 table.setRowFactory(tv -> { 
     TableRow<Move> move = new TableRow<Move>(); 
     move.setOnMouseClicked(event -> { 
      if(event.getClickCount()==2 && !move.isEmpty()) 
       setBoardTo(move.getItem()); 
      else 
       System.out.println("kek"); 
     }); 
     return move; 
    }); 

然後,我們有我們在(它的工作原理)去的功能,但即使在將電路板更換爲另一個電路板並重新繪製之後,它看起來也是如此。

private void setBoardTo(Move move){ 
    System.out.println(move.boardState.toString()); 
    System.out.println(board.toString()); 
    board.setBoard(move.boardState); 
    board.draw(); 
} 

在Board類中用於分配值的函數。

public void setBoard(Board another){ 
    this.boardFigures = another.boardFigures; 
    this.highlightedFields = another.highlightedFields; 
    this.hasHighlightedFields = another.hasHighlightedFields; 
} 

最後的部分是一個片段從我的移動類(它包含了移動的信息,但我把它割下來,使代碼看起來更乾淨)

public class Move { 
private static int globalID=0; 
public int ID; 
final Board boardState; 

public Move(Board board){ 
    ID=globalID++; 
    boardState = new Board(board);} 

我在做什麼錯?如果需要其他東西,我會盡快將其粘貼。

感謝,roiek

+0

你可以問一個具體的問題,而不是發佈代碼片段。什麼不工作?你遇到了什麼錯誤?請僅發佈相關代碼 – smac89

+0

問題是,在SetBoard函數中,我檢查了move.BoardState與board(通過toString)不同,但仍然在畫布上獲得相同的輸出 – user3476159

回答

0

這是很難看到你綁在有限的代碼做什麼,但你提到你正在尋找保存的歷史,但再有這樣的代碼:

public void setBoard(Board another){ 
    this.boardFigures = another.boardFigures; 
    this.highlightedFields = another.highlightedFields; 
    this.hasHighlightedFields = another.hasHighlightedFields; 
} 

如果這些不是原始值,問題是你沒有複製對象的值,而是存儲對該對象的引用。如果該對象將來發生變化,那麼當您指向更新的對象時,歷史記錄將不會保留。

如果這是問題,則需要對要保存的對象進行實際複製。有關複製對象的詳細信息,請參閱this example,並閱讀有關object references here的更多信息。