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)
每个操作都应包含逆转它所需的所有信息。 (涉及到的节点,做了什么,之前怎么样)
我正在使用 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)
每个操作都应包含逆转它所需的所有信息。 (涉及到的节点,做了什么,之前怎么样)