(swing读书笔记)Undo/Redo(下)
来源:互联网 发布:qq群文件件网络不可用 编辑:程序博客网 时间:2024/05/21 17:16
(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对象——剩下的事情,交给它就好了。
- (swing读书笔记)Undo/Redo(下)
- (swing读书笔记)Undo/Redo(上)
- TimeBetweenLocalCheckpoints (redo undo)
- 转载:UNDO和REDO读书笔记
- Oracle基本数据改变原理浅析(redo与undo)--oracle核心技术读书笔记一
- 第七章 Redo and Undo (二)
- 第七章Redo and Undo (一)
- 利用swing的undo包实现Undo/Redo功能
- qt的redo和undo undo撤销(后退),redo取消撤销(前进)
- Undo/Redo几种实现方式介绍(—)——undo/redo介绍
- (swing读书笔记)JTable简介(下)
- (swing读书笔记)JTree简介(下)
- 手把手教你写Undo、Redo程序(续)
- 手把手教你写Undo、Redo程序(续)
- 手把手教你写Undo、Redo程序(续)
- 手把手教你写Undo、Redo程序(续)
- 可以进行多步撤消(Undo、Redo)的TextBox
- C++实现Undo和Redo框架(命令模式)
- linux 中断机制的处理过程
- (swing读书笔记)Undo/Redo(上)
- <WP7>(五)手把手教你写天气预报程序:ApplicationBar的使用和ListPicker的数据绑定
- IOS 入门开发之导航栏按钮切换
- ubuntu windows 文件共享
- (swing读书笔记)Undo/Redo(下)
- phpcms标签大全V9
- STM32F103的ADC问题
- 程序员成长路上的团队修炼之道
- 往下拖动页面滚动条时,固定住菜单栏(不随其他内容网上滚动,兼容各版本IE、Chrome、Firefox)
- maximo 日期格式调整
- SNS社交平台的核心技术架构
- (swing读书笔记)JTable简介(上)
- SQL ERROR 17002