Я пытаюсь реализовать undo/redo в JavaFX - рисую все свои фигуры с помощью graphicsContext()
. Я огляделся и обнаружил, что существует метод save
в графическом контексте, но он просто сохраняет атрибуты, а не фактическую форму/состояние холста. Какой был бы лучший способ обойти это?Внедрение Undo/Redo в JavaFX
Это один из моих фрагментов кода, когда я создаю круг, например:
public CircleDraw(Canvas canvas, Scene scene, BorderPane borderPane) {
this.borderPane = borderPane;
this.scene = scene;
this.graphicsContext = canvas.getGraphicsContext2D();
ellipse = new Ellipse();
ellipse.setStrokeWidth(1.0);
ellipse.setFill(Color.TRANSPARENT);
ellipse.setStroke(Color.BLACK);
pressedDownMouse = event -> {
startingPosX = event.getX();
startingPosY = event.getY();
ellipse.setCenterX(startingPosX);
ellipse.setCenterY(startingPosY);
ellipse.setRadiusX(0);
ellipse.setRadiusY(0);
borderPane.getChildren().add(ellipse);
};
releasedMouse = event -> {
borderPane.getChildren().remove(ellipse);
double width = Math.abs(event.getX() - startingPosX);
double height = Math.abs(event.getY() - startingPosY);
graphicsContext.setStroke(Color.BLACK);
graphicsContext.strokeOval(Math.min(startingPosX, event.getX()), Math.min(startingPosY, event.getY()), width, height);
removeListeners();
};
draggedMouse = event -> {
ellipse.setCenterX((event.getX() + startingPosX)/2);
ellipse.setCenterY((event.getY() + startingPosY)/2);
ellipse.setRadiusX(Math.abs((event.getX() - startingPosX)/2));
ellipse.setRadiusY(Math.abs((event.getY() - startingPosY)/2));
};
}
[UndoFX library] (https://github.com/TomasMikula/UndoFX) может помочь вам в решении вашей проблемы. Библиотека просто предоставляет абстрактный диспетчер состояний Undo/Redo, поэтому он не решает проблему из коробки, вам понадобится совсем немного кода в вашем приложении, чтобы соответствующим образом использовать его (например, такие вещи, как «EllipseDrawOperation» из решения fabian все равно потребуется, чтобы библиотека UndoFX просто обеспечивала место для хранения и управления историей таких операций). – jewelsea