1

使用UndoFX 库,我创建了一个 UndoManger,如下所示:

EventStream<DocumentChange<?>> changes = document.getChanges();

undoManager =
  UndoManagerFactory.unlimitedHistoryUndoManager(
    changes,
    c -> c.redo(),
    c -> c.undo(),
    (c1, c2) -> c1.mergeWith(c2)
  );

文档返回的ReactFX EventStream是通过合并多个在文档创建时可用的 EventStream 来创建的。例如,

documentChanges = EventStreams.merge(selectedSymbolChanges, symbolListChanges);

但是,文档稍后会添加项目,这些项目包括也应该发布到文档 EventStream 的 EventStream。我试过了

documentChanges = EventStreams.merge(documentChanges, newObjectChanges);

但是,newObjectChangesEventStream 中的更改从未影响 UndoManager。

在创建 UndoManger 之后,将其他 EventStreams 合并到 UndoManger 中的最佳方法是什么?或者这是不可能的(即流必须是不可变的)?

如果是后者,如何为 UndoManager 创建时不存在的动态数量的对象创建流?

4

1 回答 1

2

有两种方法可以解决这个问题。

  1. 创建一个ObservableSet事件流并使用EventStreams.merge(ObservableSet)动态合并集合中的所有流。然后,您可以在集合中动态添加/删除流。

  2. 使用 aConnectableEventStream作为占位符,稍后将其连接到动态获取的流:

    ConnectableEventStream<DocumentChange<?>> dynamicChanges =
            new ConnectableEventSource<>();
    
    EventStream<DocumentChange<?>> documentChanges =
            EventStreams.merge(staticChanges, dynamicChanges);
    
    // later
    dynamicChanges.connectTo(newObjectChanges1);
    dynamicChanges.connectTo(newObjectChanges2);
    
于 2015-04-21T15:39:04.867 回答