它实际上看起来像大多数编辑器提供的 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.