(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(下)相关推荐

  1. (swing读书笔记)Undo/Redo(上)

    (swing读书笔记)Undo/Redo(上) By cszhao1980 一.UndoableEdit系列 Undo.Redo是十分有用的功能,Swing提供了一组类来协助用户完成Undo.Redo ...

  2. (swing读书笔记)JTable简介(下)

    (swing读书笔记)JTable简介(下) by cszhao1980 六.Row 最初,JTable没有提供任何"Row"相关的类来控制Row,与Row相关的大量操作直接坐落在 ...

  3. (swing读书笔记)JTree简介(下)

    (swing读书笔记)JTree简介(下) By cszhao1980 六.TreeCellRenderer 通过JTable一样,JTree也使用一个接口定义它的单元绘制器,该接口仅有一个方法: C ...

  4. (swing读书笔记)Swing Look And Feel(3)

    (swing读书笔记)Swing Look And Feel(3) By cszhao1980 六.UIResource UIResource是个空接口,它的目的是为标识一种身份,即是否为UI Res ...

  5. (swing读书笔记)Swing Look And Feel(2)

    (swing读书笔记)Swing Look And Feel(2) By cszhao1980 三.      UI defaults UIDefaults内部维护了一张巨大的Hashtable, 记 ...

  6. (swing读书笔记)Swing Look And Feel(4)

    (swing读书笔记)Swing Look And Feel(4) By cszhao1980 八.MetalLookAndFeel的功能增强 Swing对它默认的跨平台L&F提供了功能的增强 ...

  7. swing读书笔记转载

    (swing读书笔记)Swing Look And Feel(1) http://blog.csdn.net/cszhao1980/article/details/7343524 (swing读书笔记 ...

  8. (swing读书笔记)JTree简介(中)

    (swing读书笔记)JTree简介(中) By cszhao1980 三.TreeModel(树模型) 同JTable相比,TreeModel接口显得不那么重要.这是Tree的特殊性造成的--Tre ...

  9. Swing学习系列 -- Swing读书笔记目录

    为了便于二次查找,学习,特列出Swing的目录如下 ++ Swing读书笔记 1-1Swing常用的package ++ Swing读书笔记 1-3版面管理器(Layout Menager) 1-3- ...

最新文章

  1. anaconda与python的idle冲突吗_anaconda(python3)与python2共存
  2. dedecms 漏洞_代码审计之二次漏洞审计
  3. go使用for...range遍历数组
  4. ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
  5. OVERLAPPED结构与GetOverlappedResult函数
  6. Python内置数据类型之Tuple
  7. 看从小自带BUFF的他,如何用代码降低万物互联的门槛
  8. java分页封装到dao层,Node Dao层的封装与分页
  9. 简单理解操作系统中的PV操作
  10. mindray心电监护仪使用说明_界面张力仪的使用步骤以及画面清晰度相关说明
  11. 10. 王道考研-树与二叉树
  12. CDC::Arc 汉化参数明说及举例
  13. ORACLE DELETE数据慢的案例
  14. 约翰·冯·诺依曼:一个向上帝买了挂的男人!!
  15. Ubantu16.04+CUDA10.0安装mmaction以及提取UCF101的frame和optical flow
  16. 施乐700彩机服务器维修,施乐700DCP彩色数码复印机维修手册:700dcp_sc_ver1.1_chap05(208页)-原创力文档...
  17. sso单点登录系统(精华篇)
  18. keystore java_Java KeyStore getEntry()用法及代码示例
  19. centos7安装jdk1.8.0并配置JAVA_HOME环境变量
  20. You may need an appropriate loader to handle this file type, currently no loaders are configured to

热门文章

  1. 安科瑞交流三相表电表在越南光伏的应用(防逆变)
  2. Error: error:0308010C:digital envelope routines::unsupported
  3. 乔布斯:不要为明天忧虑
  4. 大寰PGE平行夹爪亮点与参数
  5. 全端通用快速开发UI组件库UnifyUi大更新,Unify Ui是基于uni-app的全端(vue/nvue)组件库
  6. 孤儿助养助学基金逾千万 汶川孤儿牵动上海住德的心
  7. 结构方程模型(SEM)高阶应用暨嵌套分层数据及数据分组分析
  8. 如何增加产品属性(鞋码/衣服尺寸)
  9. Nature Comm | 昆士兰大学水中心-细菌介导的新型丙烷厌氧氧化耦合硝酸盐还原过程...
  10. 优秀课件笔记旅游需求预测Forecast of Tourism DemandsChapter Demands