如何在 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 中实现“用户只能编辑自己的帖子/模型”