【问题标题】:Add EventStream of dynamically created object changes to UndoManager将动态创建的对象更改的 EventStream 添加到 UndoManager
【发布时间】:2015-04-21 14:34:17
【问题描述】:

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

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

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

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

documentChanges = EventStreams.merge(selectedSymbolChanges, symbolListChanges);

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

documentChanges = EventStreams.merge(documentChanges, newObjectChanges);

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

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

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

【问题讨论】:

    标签: javafx reactive-programming frp undo-redo reactfx


    【解决方案1】:

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

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

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

      ConnectableEventStream<DocumentChange<?>> dynamicChanges =
              new ConnectableEventSource<>();
      
      EventStream<DocumentChange<?>> documentChanges =
              EventStreams.merge(staticChanges, dynamicChanges);
      
      // later
      dynamicChanges.connectTo(newObjectChanges1);
      dynamicChanges.connectTo(newObjectChanges2);
      

    【讨论】:

    • 我选择了后者,效果很好。感谢您的解决方案和甜蜜的图书馆! UndoFX 使在 JavaFX 中实现撤消/重做变得轻而易举,尤其是在利用更改事件合并时。
    猜你喜欢
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多