Я закодировал консольную шахматную партию в Java и теперь хочу превратить ее в GUI игру с помощью JavaFx. В основной сцене root - это группа, содержащая три GridPanes: одна Rectangle GridPane для цветных квадратов, одна GridPane ImageView для спрайтов частей и последняя Button GridPane, чтобы пользователь мог выбрать элемент на доске и переместить это где-то.
Прямо сейчас все, что я хочу сделать, это чтобы моя сцена занимала позицию доски, а затем отображала соответствующую доску каждый раз, когда делаются ходы.
Код для отображения позиции доски работает, так как всякий раз, когда я инициализирую сцену root с начальной позицией доски Group, фигуры отображаются правильно. Проблема в том, что после того, как игрок делает ход, никакие изменения не вносятся в то, что отображается.
Доказательство того, что доска может отображаться правильно
Хотя после того, как я сделать ход по доске, ничего не меняется. Перемещение выполняется на фактическом объекте доски в бэкэнде, но отображаемая доска не обновляется. Он просто остается таким же, как и был выше.
Изменения бэкэнда Proof
Прямо сейчас код в моем методе запуска выглядит следующим образом:
@Override
public void start(Stage primaryStage) throws Exception
{
primaryStage.setTitle("Chess");
primaryStage.setResizable(false);
Player whitePlayer = new CPUPlayer(ChessColor.WHITE);
Player blackPlayer = new CPUPlayer(ChessColor.BLACK);
Board board = new Board();
Scene scene = new Scene(board.root, 400.0, 400.0);
Square startSquare = board.getSquare(1, 4);
Square endSquare = board.getSquare(3, 4);
//printing these out to prove move actually happens on board object
board.printBoard();
Move move = new Move(whitePlayer, startSquare, endSquare, board, MoveType.NORMAL);
move.movePiece();
//after this I have tried updating the entire Group containing all the GridPanes,
//as well as just the GridPane containing the piece ImageViews. Neither did anything.
//printing these out to prove move actually happens on board object
board.printBoard();
primaryStage.setScene(scene);
primaryStage.show();
}
Вот как я устанавливаю GridPane для спрайтов частей:
public GridPane setPieces()
{
GridPane pieces = new GridPane();
int printRow = 0;
for (int i = 7; i >= 0; i--)
{
for (int j = 0; j < 8; j++)
{
pieces.add(new ImageView(rightImageForPiece(getSquare(i, j).getPiece())), j, printRow);
}
printRow++;
}
return pieces;
}
Вот как я устанавливаю группу root:
public void setRoot()
{
Group root = new Group();
root.getChildren().add(squares);
root.getChildren().add(setPieces());
root.getChildren().add(buttons);
this.root = root;
}
И это конструктор для the Board:
Board()
{
//just for the backend
setNewBoard();
//for javafx
this.buttons = setButtons();
this.squares = setSquares();
this.pieces = setPieces();
setRoot();
}
Итак, есть ли способ, как только я установил группу root моей сцены, обновить отдельную GridPane, чтобы она отображала изменения, сделанные на шахматной доске.
Если вам нужна дополнительная информация, просто дайте мне знать, так как я впервые задаю вопрос здесь.