(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) |
void |
storeState(Hashtable<Object, Object> 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() |
该方法会自动调用storeState(HashtableObject, Object> state)方法——事实上,在使用stateEdit对象时,一般不直接调用storeState,而是通过end()方法。
五.连续UNDO、REDO的能力
借助StateEdit类,我们很容易实现连续UNDO、REDO的功能。我们可以为每次编辑创立一个StateEdit对象,并维护好每个对象的前后关系。我们要做的就是找到正确的StateEdit对象——剩下的事情,交给它就好了。
(swing读书笔记)Undo/Redo(下)相关推荐
- (swing读书笔记)Undo/Redo(上)
(swing读书笔记)Undo/Redo(上) By cszhao1980 一.UndoableEdit系列 Undo.Redo是十分有用的功能,Swing提供了一组类来协助用户完成Undo.Redo ...
- (swing读书笔记)JTable简介(下)
(swing读书笔记)JTable简介(下) by cszhao1980 六.Row 最初,JTable没有提供任何"Row"相关的类来控制Row,与Row相关的大量操作直接坐落在 ...
- (swing读书笔记)JTree简介(下)
(swing读书笔记)JTree简介(下) By cszhao1980 六.TreeCellRenderer 通过JTable一样,JTree也使用一个接口定义它的单元绘制器,该接口仅有一个方法: C ...
- (swing读书笔记)Swing Look And Feel(3)
(swing读书笔记)Swing Look And Feel(3) By cszhao1980 六.UIResource UIResource是个空接口,它的目的是为标识一种身份,即是否为UI Res ...
- (swing读书笔记)Swing Look And Feel(2)
(swing读书笔记)Swing Look And Feel(2) By cszhao1980 三. UI defaults UIDefaults内部维护了一张巨大的Hashtable, 记 ...
- (swing读书笔记)Swing Look And Feel(4)
(swing读书笔记)Swing Look And Feel(4) By cszhao1980 八.MetalLookAndFeel的功能增强 Swing对它默认的跨平台L&F提供了功能的增强 ...
- swing读书笔记转载
(swing读书笔记)Swing Look And Feel(1) http://blog.csdn.net/cszhao1980/article/details/7343524 (swing读书笔记 ...
- (swing读书笔记)JTree简介(中)
(swing读书笔记)JTree简介(中) By cszhao1980 三.TreeModel(树模型) 同JTable相比,TreeModel接口显得不那么重要.这是Tree的特殊性造成的--Tre ...
- Swing学习系列 -- Swing读书笔记目录
为了便于二次查找,学习,特列出Swing的目录如下 ++ Swing读书笔记 1-1Swing常用的package ++ Swing读书笔记 1-3版面管理器(Layout Menager) 1-3- ...
最新文章
- anaconda与python的idle冲突吗_anaconda(python3)与python2共存
- dedecms 漏洞_代码审计之二次漏洞审计
- go使用for...range遍历数组
- ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
- OVERLAPPED结构与GetOverlappedResult函数
- Python内置数据类型之Tuple
- 看从小自带BUFF的他,如何用代码降低万物互联的门槛
- java分页封装到dao层,Node Dao层的封装与分页
- 简单理解操作系统中的PV操作
- mindray心电监护仪使用说明_界面张力仪的使用步骤以及画面清晰度相关说明
- 10. 王道考研-树与二叉树
- CDC::Arc 汉化参数明说及举例
- ORACLE DELETE数据慢的案例
- 约翰·冯·诺依曼:一个向上帝买了挂的男人!!
- Ubantu16.04+CUDA10.0安装mmaction以及提取UCF101的frame和optical flow
- 施乐700彩机服务器维修,施乐700DCP彩色数码复印机维修手册:700dcp_sc_ver1.1_chap05(208页)-原创力文档...
- sso单点登录系统(精华篇)
- keystore java_Java KeyStore getEntry()用法及代码示例
- centos7安装jdk1.8.0并配置JAVA_HOME环境变量
- You may need an appropriate loader to handle this file type, currently no loaders are configured to
热门文章
- 安科瑞交流三相表电表在越南光伏的应用(防逆变)
- Error: error:0308010C:digital envelope routines::unsupported
- 乔布斯:不要为明天忧虑
- 大寰PGE平行夹爪亮点与参数
- 全端通用快速开发UI组件库UnifyUi大更新,Unify Ui是基于uni-app的全端(vue/nvue)组件库
- 孤儿助养助学基金逾千万 汶川孤儿牵动上海住德的心
- 结构方程模型(SEM)高阶应用暨嵌套分层数据及数据分组分析
- 如何增加产品属性(鞋码/衣服尺寸)
- Nature Comm | 昆士兰大学水中心-细菌介导的新型丙烷厌氧氧化耦合硝酸盐还原过程...
- 优秀课件笔记旅游需求预测Forecast of Tourism DemandsChapter Demands