【发布时间】:2016-11-17 16:10:25
【问题描述】:
我正在尝试在 JavaFX 中实现撤消/重做 - 我使用 graphicsContext() 绘制所有形状。我环顾四周,发现图形上下文中有一个save 方法,但它只是保存属性而不是画布的实际形状/状态。最好的解决方法是什么?
这是我创建圆圈时的代码之一,例如:
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 可能会帮助您解决问题。该库仅提供了一个抽象的撤消/重做状态管理器,因此它不能解决开箱即用的问题,您需要在应用程序中使用相当多的自定义代码才能适当地使用它(例如,诸如fabian 的解决方案中的
EllipseDrawOperation仍然需要 UndoFX 库,它只是提供了一个存储和操作此类操作历史记录的地方。
标签: java javafx javafx-2 javafx-8