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

时间:2019-05-19 22:51:06

标签: java version-control

我正处在一个Java项目的中间。我已经制作了一个GUI编辑器,您可以在其中加载,通过GUI编辑并保存在系统磁盘上。我来到了这个用户故事,并不真正知道该如何处理。似乎是文档的git吗?

  

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

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

我认为可变策略正在以字符串形式保存当前进度吗?每次编辑GUI的JTextArea时,是否都应该更新字符串?

1 个答案:

答案 0 :(得分:0)

实际上,这似乎是大多数编辑人员提供的UNDO操作,但是具有不同的“版本处理”过程。

为了实现波动策略(如上所述),我将使用数据结构来保留文档的版本。例如,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);
}

同样的方法适用于稳定策略,但是您没有数据结构,而是将克隆保存在硬盘中,其名称稍后可以搜索以便返回。例如,版本1,版本2,版本3等。要返回时,只需简单地加载文件“版本” +(document.getVersionId-1)。


关于随时更改版本策略,这很容易。创建代表这些版本机制的类(例如VolatileStrategy,StableStrategy),并为其添加关系。可以通过父类(VolatileStrategy extends VersionStrategy)或像VolatileStrategy implements VersionStrategy这样的接口(我希望这样做)来完成。最后,保留活动策略private VersionStrategy versionStrategy;的引用,只要您想更改它,就可以简单地: versionStrategy = new StableStrategy();


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

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

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