Я использую UndoFX & ReactFX для реализации функции Undo/Redo для моего приложения 2D-формы.UndoFX: Undo/Redo запись каждого пикселя перетаскивания
Проблема в том, когда я перемещаю свою фигуру, EventStream записывает каждый пиксель движения X/Y. Я просто хочу записать последнюю позицию (когда пользователь отпускает перетаскивание).
Что я пытался до сих пор:
Вместо использования changesOf(rect.xProperty()).map(c -> new xChange(c));
и changesOf(rect.yProperty()).map(c -> new yChange(c));
Я создал DoubleProperty x,y
и сохранили форму х, свойство у этих переменных при наведении курсора мыши пользователь освобождается. И наконец, я меняю свои измененияOf на: 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
Я предлагаю _merging_ последующие изменения одного и того же вида (здесь перемещение фигуры) в одно изменение. Это продемонстрировано в [demo] (https://github.com/TomasMikula/UndoFX/#demo) (см. Методы 'mergeWith' в' CenterXChange' и 'CenterYChange'). –
Я просто пробовал это, не работал: (такое же поведение снова!) На самом деле точная проблема заключается в том, что я перемещаю фигуру по горизонтали и по вертикали в одно и то же время. Если я переместил ее точно в одно направление, то это будет нормально работать. – Senpai
whoa, i просто понял, что вы создали UndoFX: D. Спасибо за вашу работу! – Senpai