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

By cszhao1980

一.UndoableEdit系列

Undo、Redo是十分有用的功能,Swing提供了一组类来协助用户完成Undo、Redo功能。

1.1  UndoableEdit

首先是执行Undo、Redo操作功能的类——“UndoableEdit <--------AbstractUndoableEdit”。其中,UndoableEdit是接口,而AbstractUndoableEdit是Swing提供的简单实现该接口的类。

UndoableEdit中最重要的方法是undo()和redo()方法,分别完成undo、redo操作。显然,用户必须重新实现这两个方法——AbstractUndoableEdit(或其他的什么Swing预先提供的类)是不可能知道用户究竟要如何进行undo、redo操作的。需要注意的是,继承AbstractUndoableEdit(或其他)的类在实现undo()、redo()方法时,必须首先调用父类的同名方法。

通过UndoableEdit对象,就可以实现一级的Undo、Redo。通过记录每次的UndoableEdit对象,就能实现多级的Redo、Undo。

1.2  UndoableEditListener和UndoableEditEvent

显然,当用户执行了一个可undo的操作时,就需要通知它的观察者们,以使他们能够进行此次操作的Undo、Redo。观察者必须实现undoableEditListener接口。该接口仅有一个方法,public void undoableEditHappened(UndoableEditEvent e),而UndoableEditEvent.getEdit()会返回UndoableEdit对象。

1.3  UndoableEditSupport

UndoableEditSupport类是Swing提供的,供undoableEdit对象维护其观察者名单的辅助类。它提供addUndoableEditListener()、reMoveUndoableEditListener()方法。容易理解,该类内部维护了一个观察者的List(vector),而且,它还提供了getUndoableEditListeners()方法来返回观察者数组。

前面提到,当UndoableEdit对象的状态发生变化时,必须通知观察者,而这一点也是通过UndoableEditSupport完成的——你必须调用UndoableEditSupport的postEdit(UndoableEdit e),才能进行消息传递。正如你所想象的那样,postEdit(UndoableEdit e)会使用UndoableEdit e参数生成一个UndoableEditEvent对象,并调用各个观察者的undoableEditHappened方法。

二.组合Undo、Redo

有时候,我们希望能够将“一系列的操作”一次Undo,Swing提供了继承自AbstractUndoableEdit的CompoundEdit类来完成这个功能。

CompoundEdit内部维护一个UndoableEdit数组(vector)——它的UndoRedo方法时逆序委托该数组的每一个元素完成——以此就完成了组合UndoRedo

 

addEdit方法可以将一个UndoableEdit对象添加进来,作为组合的一部分。

boolean

addEdit(UndoableEdit anEdit)
          如果此编辑为 inProgress,则接受 anEdit 并返回 true。

inProgress用来表示CompoundEdit对象是否还在“组合编辑”的过程中,isInProgress()方法会返回这个值——它将一直为true,直到调用CompoundEdit对象的end()方法。顺便说一句,如果在调用了end()方法之前,调用redo()、undo()方法,会抛出异常。

 

CompoundEdit往往配合“普通”的UndoableEdit对象使用,当执行一次操作后,CompoundEdit 对象(可以自己实现Listener接口,也可以有Listener委托)捕获“普通”的UndoableEdit对象的UndoableEditEvent消息,将其Add进来,作为组合的一部分。

三.更好的工具——UndoManager

使用CompoundEdit似乎还不是那么方便,比如:

(1)         我们必须自己实现UndoableEditListener接口,以截获UndoableEditEvent对象,然后调用CompoundEdit.AddEdit(UndoableEdit a)将其加入组合;

(2)         CompoundEdit对象本身也有一些问题,比如,只有在调用end()方法后才能进行redo()undo()操作,否则会抛出异常。

 

Swing的设计者们看到了这一点,于是提供了一个更好的工具——UndoManager。UndoManager继承自CompoundEdit,不仅如此,它还实现了UndoableEditListener接口,自动进行addEdit()操作。

不仅如此,UndoManager在调用end()方法之前也可以进行redo()undo()操作——只进行last UndoableEdit对象的操作。而一旦调用了end()方法,UndoManager就可以进行组合redo()undo()操作了——其实就是连续的Redo、Undo的能力。

 

UndoManager是个很好用的接口,我们可以直接使用它;也可以扩展它——多数情况下,是为它添加一个装饰者。

(swing读书笔记)Undo/Redo(上)相关推荐

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

    (swing读书笔记)Undo/Redo(下) By cszhao1980 四.更好的集成--StateEdit 现在,实现Undo功能已经比较简单了: (1)         建立一个"普 ...

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

    (swing读书笔记)JTable简介(上) by cszhao1980 JTable是Swing中最复杂的组件之一.在JTable周围,环绕着JTableHeader.TableModel.Tabl ...

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

    (swing读书笔记)JTree简介(上) By cszhao1980 同JTable类似,JTree也是一个负责的组件,其周围也有大量附属接口.类,如下图所示: 一.TreeNode(树节点) Tr ...

  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(4)

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

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

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

  7. swing读书笔记转载

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

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

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

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

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

最新文章

  1. oracle中 怎么替换,oracle如何替换字符串?
  2. CCS5中的小钥匙标志是什么意思
  3. 自定义FireFox浏览器滚动条
  4. idea快捷键生成返回类型_十三肝了2晚的《IDEA操作手册-终极秘籍》终于来了......
  5. C#解析单层html的中的文本,然后拼接起来
  6. 学会java基础能找工作吗?
  7. Python的第三方库xlrd
  8. python数据库管理软件_MySQL管理工具MySQL Utilities — 介绍与安装(1)
  9. python-socket模块介绍
  10. 算法笔记_面试题_6.二进制/位运算相关
  11. 【4G模块】-有方科技Neoway-N720
  12. JS实现新年倒计时动画特效+音乐案例
  13. 实时数据采集架构原理(蜂巢)
  14. 安装fastadmin 该网页无法正常运作,将您重定向的次数过多
  15. C语言旅途之输出N的M次方的后三位数
  16. 苍穹外卖-day02
  17. 智商黑洞(门萨Mensa测试)9
  18. html5如何设置视频为静音,html5中设置或返回音频/视频是否应该被静音的属性muted-...
  19. linux防火墙关闭开放的端口,Linux关闭防火墙,开放端口
  20. 一摞python风格的纸牌(fluent python阅读)

热门文章

  1. K8S node-shell
  2. Aigtek线束测试仪,高压线缆测试仪
  3. progressive-generation-master代码记录【下载处理数据】(定义CNNDataset类)
  4. 自带流量的幼儿园网站,就不用推广了吗
  5. 北京艺考培训 | 家长信赖的十大艺考机构
  6. openwrt php-fpm,OpenWRT 定时自动开关Wifi
  7. [行为检测|论文解读]行为检测调研综述
  8. 凤凰卫视天气预报的背景音乐《兰花》:Yanni's With an orchid
  9. 小猪佩奇html源码,快手抖音小猪佩奇和真人一起的视频制作软件和教程
  10. 【SPSS】利用spss进行图斑数据统计