Я работаю над 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
}
}