JavaFX 覆盖对象

JavaFX overwrite object

我正在尝试使用 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 class 中我用来赋值的函数。

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

最后一部分只是我的 Move 的一个片段 class(它包含有关 moves 的信息,但我将其删除以便代码看起来更干净)

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

很难看出您要使用有限的代码做什么,但是您提到您希望保留历史记录但随后有了以下代码:

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

如果这些不是原始值,问题是您没有复制对象的值,而是存储了对该对象的引用。如果该对象将来发生变化,当您指向更新后的对象时,将不会保留历史记录。

如果这是问题所在,您需要对要保留的对象进行真正的复制。参见 this example for details about copying objects, and read more about object references here