JavaFX Canvas не очищается при изменении размера - PullRequest
0 голосов
/ 27 мая 2020

Я работаю над JavaFX Ti c Ta c Toe. Поскольку мне нужно перерисовать холст при изменении размера окна, я подключил слушателя, который вызывает repaint() при изменении размера окна. Однако, когда вызывается repaint(), экран не очищается перед рисованием нового окна, поэтому каждый кадр перекрывается с предыдущим.

Вот мой контроллер. Я удалил части, которые не имеют отношения к проблеме.


public class TicTacToeController {
  public Canvas canvas;
  public BorderPane pane;
  private CellState[][] board = new CellState[3][3];
  public Status status = Status.PLAYING;
  public boolean isOTurn = false;

  @FXML
  public void initialize() {
    canvas.widthProperty().bind(pane.widthProperty());
    canvas.heightProperty().bind(pane.heightProperty());

    clearBoard();
    repaint();

    canvas.widthProperty().addListener(onResize);
    canvas.heightProperty().addListener(onResize);
  }

  private final InvalidationListener onResize = (obs) -> {
    repaint();
  };
  public void clearBoard() {
    for (int i = 0; i < 3; i++)
      for (int j = 0; j < 3; j++) {
        board[i][j] = CellState.EMPTY;
      }
  }

  public void doLogic(MouseEvent mouseEvent) {
    //Update or clear board
    repaint();
  }

  protected void repaint() {
    GraphicsContext ctx = canvas.getGraphicsContext2D();
    final double WIDTH = canvas.getWidth();
    final double HEIGHT = canvas.getHeight();
    ctx.clearRect(0, 0, WIDTH, HEIGHT);
    // redraw code here
  }

  public enum Status {
    PLAYING, DRAW, X_WINS, O_WINS
  }

  public enum CellState {
    EMPTY, X, O
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...