(swing读书笔记)Undo/Redo(下)

 

 

(swing读书笔记)Undo/Redo(下)

                                 By cszhao1980

四.更好的集成——StateEdit

现在,实现Undo功能已经比较简单了:

(1)         建立一个“普通”的UndoableEdit对象,完成真正的Undo()、Redo()功能;

(2)         建立一个UndoManager对象,作为“普通”UndoableEdit对象的观察者;

(3)         建立一个UndoableEditSupport对象,辅助建立两者之间的观察关系。

 

观察这三条,发现他们其实是具有高内聚的一组对象,我们完全可以把他们合起来,对外展现一个对象——即Swing提供的StateEdit类。

【注】:StateEdit类实现了UndoableEdit接口,没有实现UndoableEditListener接口,这其实很容易理解,既然他们变成了一个类,又何必使用事件传递信息呢。

 

StateEdit可以保持两个状态,在两个状态之间切换,从而实现redo()、undo()功能。这两个状态是通过两个Hashtable来保存的,我们通过以下两个方法实现状态切换:

void

restoreState(Hashtable<Object, Object> state)
          收到此消息时,接收者应从 state 中提取任何相关状态。

 void

storeState(Hashtable<Object, Object> state)
          收到此消息时,接收者应把任何相关状态放置到 state 中。

 
使用Hashtable有很多好处:
(1)         StateEdit的一个状态可以记录多个对象的内容,即实现了组合Edit;
(2)         按照键值(可使用对象句柄)可以提取每个对象的内容,从而完成每个对象的Undo、Redo。
 
StateEdit的undo()、redo()会自动调用restoreState()方法来完成操作,因此,我们必须重载该方法,以真正完成undo、redo操作——这很容易实现,通过传入的Hashtable,我们可以轻易获取存放的对象和其中的内容,逐一更新即可。
 
前面说过,StateEdit含有两个状态——也就维护了两个Hashtable。但是storeState(Hashtable<Object, Object> state)方法仅有一个。而且,传入的是“New状态” Hashtable,“old状态”Hashtable会被自动维护,我们不需要处理。
 
另一个重要的方法是end()

 void

end()
          获取 StateEditable 对象的后编辑状态,并结束编辑。

该方法会自动调用storeState(HashtableObject, Object> state)方法——事实上,在使用stateEdit对象时,一般不直接调用storeState,而是通过end()方法。

五.连续UNDO、REDO的能力

借助StateEdit类,我们很容易实现连续UNDO、REDO的功能。我们可以为每次编辑创立一个StateEdit对象,并维护好每个对象的前后关系。我们要做的就是找到正确的StateEdit对象——剩下的事情,交给它就好了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值