Как обновить GridPane внутри группы root сцены - PullRequest
0 голосов
/ 28 мая 2020

Я закодировал консольную шахматную партию в 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, чтобы она отображала изменения, сделанные на шахматной доске.

Если вам нужна дополнительная информация, просто дайте мне знать, так как я впервые задаю вопрос здесь.

1 Ответ

0 голосов
/ 04 июня 2020

Я решил проблему, мне просто нужно было добавить бэкэнд, который обновляет плату в другой поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...