Javafx如何撤消其他形状上的形状图纸

时间:2018-12-31 17:21:03

标签: javafx shapes

我正在使用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。

1 个答案:

答案 0 :(得分:0)

如果您希望能够撤消操作,则需要存储“绘图”的状态。

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

您只需要创建一个数据结构,即可在其中存储用户(或至少几个)执行的所有操作。而且每个动作都可以撤消。

示例:

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

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

每个动作都应包含所有必要的信息以将其撤消。 (所涉及的节点,完成的操作以及之前的操作)