我正在使用 UndoFX 和 ReactFX 为我的 2D 形状应用程序实现撤消/重做功能。
问题是当我移动我的形状时,EventStream 会记录每个 X/Y 像素的移动。我只想记录最后一个位置(当用户释放拖动时)。
到目前为止我已经尝试过:
而不是使用changesOf(rect.xProperty()).map(c -> new xChange(c));
and
changesOf(rect.yProperty()).map(c -> new yChange(c));
我创建了一个DoubleProperty x,y
, 并在释放用户鼠标时将 shape x,y 属性保存到这些变量中。最后我将 changesOf 更改为:changesOf(this.x).map(c -> new xChange(c));
和changesOf(this.y).map(c -> new yChange(c));
但这不起作用,它的行为就像以前一样。
....
private class xChange extends RectangleChange<Double> {
public xChange(Double oldValue, Double newValue) {
super(oldValue, newValue);
}
public xChange(Change<Number> c) {
super(c.getOldValue().doubleValue(), c.getNewValue().doubleValue());
}
@Override void redo() { rect.setX(newValue); }
@Override xChange invert() { return new xChange(newValue, oldValue); }
@Override Optional<RectangleChange<?>> mergeWith(RectangleChange<?> other) {
if(other instanceof xChange) {
return Optional.of(new xChange(oldValue, ((xChange) other).newValue));
} else {
return Optional.empty();
}
}
@Override
public boolean equals(Object other) {
if(other instanceof xChange) {
xChange that = (xChange) other;
return Objects.equals(this.oldValue, that.oldValue)
&& Objects.equals(this.newValue, that.newValue);
} else {
return false;
}
}
}
...
EventStream<xChange> xChanges = changesOf(rect.xProperty()).map(c -> new xChange(c));
EventStream<yChange> yChanges = changesOf(rect.yProperty()).map(c -> new yChange(c));
changes = merge(widthChanges, heightChanges, xChanges, yChanges);
undoManager = UndoManagerFactory.unlimitedHistoryUndoManager(
changes, // stream of changes to observe
c -> c.invert(), // function to invert a change
c -> c.redo(), // function to undo a change
(c1, c2) -> c1.mergeWith(c2)); // function to merge two changes