如何在 GUI 编辑器中实现文档的版本跟踪

Posted

技术标签:

【中文标题】如何在 GUI 编辑器中实现文档的版本跟踪【英文标题】:How to implement version tracking of documents in a GUI editor 【发布时间】:2019-10-06 08:00:46 【问题描述】:

我正在swing 中进行一个java 项目。我已经制作了一个 GUI 编辑器,您可以在其中加载、通过 GUI 编辑并保存在系统磁盘上。我来到了这个用户故事,但真的不知道如何处理它。它看起来像是一个用于文档的 git?

作为用户,我应该能够随时激活自动版本跟踪机制来跟踪文档演变历史。历史由一系列后续版本的 Latex 文档组成。该机制应为文档演化历史提供至少两种替代存储策略:

易失性(默认策略):对于每个文档更改,该机制将文档的先前版本保存在后续文档版本的主内存列表中。 稳定:对于每个文档更改,该机制都会保留之前版本的 磁盘存储中的文档。

我认为 volatile 策略是将当前进度保存在字符串中?是否应该每次编辑 GUI 的 JTextArea 时更新字符串?

【问题讨论】:

【参考方案1】:

它实际上看起来像大多数编辑器提供的 UNDO 操作,但具有不同的“版本处理”过程。

为了实现 Volatile 策略(如前所述),我将使用数据结构来保存文档的版本。例如,HashMap<Integer, Document> 将文档的版本保存为键,将文档克隆保存为值。因此,每当我想转到以前的版本时,我都会这样做:

private void goToPreviousVersion(Document doc)

    Document oldVersion = hashmap.get(doc.getVersionId());
    doc.setContent(oldVersion);
    //copy all properties from old version the the document

    //Update the view (GUI)

现在保存版本应该很容易。比如:

private void saveVersion(Document doc)

    hashmap.put(doc.getVersionId(), doc.clone());
    doc.setVersionId(doc.getVersionId +1);

这同样适用于稳定策略,但不是具有数据结构,而是将克隆保存在硬盘中,并使用名称稍后搜索以便返回。比如version1、version2、version3等。想回去的时候,简单的加载文件“version”+(document.getVersionId-1)。


关于随时更改版本策略,很简单。创建代表这些版本机制的类(例如 VolatileStrategy、StableStrategy)并向它们添加关系。可以通过父类 (VolatileStrategy extends VersionStrategy) 或者像 VolatileStrategy implements VersionStrategy 这样的接口(我更喜欢的东西)来完成。最后,保留活动策略的参考,private VersionStrategy versionStrategy;,无论何时您想更改它,只需: versionStrategy = new StableStrategy();


可以通过多种方式保存版本。一种简单的方法是在您的 GUI 中添加一个按钮,命名为“保持版本”。单击它时,将保留文档的一个版本。另一种方法,在所有编辑器中最常见(但实现起来更复杂)是使用计时器。

当在文本字段中按下一个键时,计时器就会启动,比如说 300 毫秒。如果在 300 毫秒之前按下另一个键,则计时器重新启动。如果在 300 毫秒内没有按下任何按钮,计时器将保存文档的版本并停止。然后,在下一次按键期间,计时器重新开始并重复此过程。

如果您有兴趣实现第二种方式,但您以前从未使用过 Swing 计时器,请查看How to use timers in swing.

【讨论】:

以上是关于如何在 GUI 编辑器中实现文档的版本跟踪的主要内容,如果未能解决你的问题,请参考以下文章

如何在用于编辑 HTML 的 Javascript 组件中实现视图模型分离?

如何在 Laravel 中实现“用户只能编辑自己的帖子/模型”

SwiftUI:如何在 macOS 应用程序中实现编辑菜单

ProtoEditor - 如何在Unity中实现一个Protobuf通信协议类编辑器

如何在Unity中实现AStar寻路算法及地图编辑器

如何在富编辑控件中实现对 URL 的鼠标单击