JavaFXで取り消し/やり直しを実装しようとしています。私はgraphicsContext()
を使ってすべての形状を描画します。私は周囲を見渡して、Graphics Contextにsave
メソッドがあることを発見しましたが、キャンバスの実際の形状/状態ではなく属性を保存するだけです。これについて最善の方法は何でしょうか?私は、例えば、円を作成するとき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ライブラリ](https://github.com/TomasMikula/UndoFX)は、問題の解決に役立つかもしれません。ライブラリは抽象的なUndo/Redo状態マネージャを提供するだけなので、そのままの状態で問題を解決することはできません。アプリケーション内でカスタムコードをかなり必要とします(例えば、ファビアンのソリューションからの 'EllipseDrawOperation'は依然として必要です.UndoFXライブラリは、そのような操作の履歴を保存して操作する場所を提供するだけです)。 – jewelsea