Javafx 如何撤消另一个形状上的形状绘图

Javafx How to undo shape drawings on another shape

我正在使用 javafx 实现一个屏幕截图应用程序,例如 lightshot。我已经完成了几乎所有的功能,但我现在停留在撤消操作上。我在像这样的矩形上添加自由绘图、线箭头、矩形等:

selection.setCursor(Cursor.CROSSHAIR);
            Arrow arrow = new Arrow();
            selection.setOnMousePressed((evt) -> {

                rootPane.getChildren().remove(arrow);
                arrow.setStartX(evt.getX());
                arrow.setStartY(evt.getY());
                arrow.setEndX(evt.getX());
                arrow.setEndY(evt.getY());
                arrow.setStyle("-fx-background-color:red");
                rootPane.getChildren().add(arrow);

            });

            selection.setOnMouseDragged((evt) -> {
                arrow.setEndX(evt.getX());
                arrow.setEndY(evt.getY());
            });
            selection.setOnMouseReleased((evt) -> {

                arrow.setEndX(evt.getX());
                arrow.setEndY(evt.getY());
            });

            drawtype = "arrow";
        });

选择是我画的矩形,这是我如何添加箭头的示例。我试过在线研究,但我似乎无法找到正确的方向,有人可以在这里帮忙吗?请记住,我没有使用 Canvas 或 GraphicsContext.

如果您希望能够撤消操作,您需要存储 'drawing' 的状态。

在您的情况下,撤消 Arrow 元素的创建很简单 rootPane.getChildren().remove(arrow);

您只需要创建一个数据结构来存储用户完成的所有操作(或至少一些操作)。每个动作都可以逆转。

示例:

ActionType.Add -> 动作:getChildren().add(xyz) -> 反向:getChildren().remove(xyz)

ActionType.Move -> arrow.setEndX(evt.getX()) -> arrow.setEndX(oldX)

每个操作都应包含逆转它所需的所有信息。 (涉及到的节点,做了什么,之前怎么样)