JavaTM Platform
Standard Ed. 6

javax.swing.undo
类 UndoManager

java.lang.Object
  继承者 javax.swing.undo.AbstractUndoableEdit
      继承者 javax.swing.undo.CompoundEdit
          继承者 javax.swing.undo.UndoManager
所有已实现的接口:
Serializable, EventListener, UndoableEditListener, UndoableEdit

public class UndoManager
     
extends CompoundEdit
implements UndoableEditListener

UndoManager 管理 UndoableEdit 列表,提供撤消或恢复适当编辑的方法。有两个方法可以将编辑添加到 UndoManager。直接使用 addEdit 方法添加编辑,或将 UndoManager 添加到支持 UndoableEditListener 的 bean。下面的例子创建了一个 UndoManager 并将它作为 UndoableEditListener 添加到 JTextField

   UndoManager undoManager = new UndoManager();
   JTextField tf = ...;
   tf.getDocument().addUndoableEditListener(undoManager);
 

UndoManager 维护编辑的有序列表以及该列表中下一个编辑的索引。下一个编辑的索引为当前编辑列表的大小,如果已经调用了 undo,则该索引对应于已撤消的最后一个有效编辑的索引。调用 undo 时,所有的编辑(从下一个编辑的索引到最后一个有效编辑)都将以相反的顺序被撤消。例如,考虑由以下编辑组成的 UndoManagerA b c D。粗体大写字母的编辑为有效编辑,斜体小写字母的编辑为无效编辑。

Figure 1

figure 1 中所示,如果刚刚添加了 D,则下一个编辑的索引为 4。调用 undo 导致在 D 上调用 undo 并将下一个编辑的索引设置为 3(编辑 c),如下图所示。

Figure 2

最后一个有效编辑为 A,所以调用 undo 会在 cb、和A 上以该顺序再次调用 undo,并将下一个编辑的索引设置为 0,如下图所示。

Figure 3

调用 redo 会导致在下一个编辑的索引和下一个有效编辑(或列表结尾位置)之间的所有编辑上调用 redo。继续上一个例子,如果调用了 redo,则将依次在 Abc 上调用 redo。此外,下一个编辑的索引被设置为 3 (如 figure 2 中所示)。

将一个编辑添加到 UndoManager 会移除从下一个编辑的索引到列表结尾位置的所有编辑。继续上一个例子,如果添加一个新的编辑 e,则从列表中移除编辑 D (在它上面调用 die 之后)。如果下一个编辑没有合并(c.addEdit(e) 返回 true)或替换(e.replaceEdit(c) 返回 true)c,则将新的编辑添加到 c 的后面,如下图所示。

Figure 4

UndoManager 上调用了 end 后,超类行为将用于所有 UndoableEdit 方法。有关其行为的详细信息,请参阅 CompoundEdit

不同于 Swing 的其他类,此类是线程安全的。

警告:此类的序列化对象与以后的 Swing 版本不兼容。当前序列化支持适用于短期存储,或适用于在运行相同 Swing 版本的应用程序之间进行 RMI(Remote Method Invocation,远程方法调用)。从 1.4 版本开始,已在 java.beans 包中添加了支持所有 JavaBeansTM 长期存储的功能。请参见 XMLEncoder


字段摘要
 
从类 javax.swing.undo.CompoundEdit 继承的字段
edits
 
从类 javax.swing.undo.AbstractUndoableEdit 继承的字段
RedoName, UndoName
 
构造方法摘要
UndoManager()
          创建一个新的 UndoManager
 
方法摘要
 boolean addEdit(UndoableEdit anEdit)
          如果可能,将一个 UndoableEdit 添加到此 UndoManager
 boolean canRedo()
          如果可以恢复编辑,则返回 true。
 boolean canUndo()
          如果可以撤消编辑,则返回 true。
 boolean canUndoOrRedo()
          如果可以调用 undoredo,则返回 true。
 void discardAllEdits()
          清空撤消管理器,向进程中的每个编辑发送一个 die 消息。
protected  UndoableEdit editToBeRedone()
          如果调用 redo,则返回下一个要恢复的有效编辑。
protected  UndoableEdit editToBeUndone()
          如果调用 undo,则返回下一个要撤消的有效编辑。
 void end()
          将此 UndoManager 转换为标准 CompoundEdit
 int getLimit()
          返回此 UndoManager 保持的最大编辑数。
 String getRedoPresentationName()
          返回此编辑可恢复形式的描述。
 String getUndoOrRedoPresentationName()
          一个便捷方法,它返回 getUndoPresentationNamegetRedoPresentationName
 String getUndoPresentationName()
          返回此编辑可撤消形式的描述。
 void redo()
          恢复适当的编辑。
protected  void redoTo(UndoableEdit edit)
          恢复从下一个编辑的索引到 edit 的所有更改,适当地更新下一个编辑的索引。
 void setLimit(int l)
          设置此 UndoManager 保持的最大编辑数。
 String toString()
          返回显示和标识此对象属性的字符串。
protected  void trimEdits(int from, int to)
          移除指定范围内的编辑。
protected  void trimForLimit()
          以下一个编辑的索引为中心,将已排队编辑的数量减少到限制的大小范围内。
 void undo()
          撤消适当的编辑。
 void undoableEditHappened(UndoableEditEvent e)
          一个 UndoableEditListener 方法。
 void undoOrRedo()
          一个便捷方法,它调用 undoredo
protected  void undoTo(UndoableEdit edit)
          撤消从下一个编辑的索引到 edit 的所有更改,适当地更新下一个编辑的索引。
 
从类 javax.swing.undo.CompoundEdit 继承的方法
die, getPresentationName, isInProgress, isSignificant, lastEdit
 
从类 javax.swing.undo.AbstractUndoableEdit 继承的方法
replaceEdit
 
从类 java.lang.Object 继承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

构造方法详细信息

UndoManager

public UndoManager()
创建一个新的 UndoManager

方法详细信息

getLimit

public int getLimit()
返回此 UndoManager 保持的最大编辑数。小于 0 的值指示编辑数不受限制。

返回:
UndoManager 保持的最大编辑数
另请参见:
addEdit(javax.swing.undo.UndoableEdit), setLimit(int)

discardAllEdits

public void discardAllEdits()
清空撤消管理器,向进程中的每个编辑发送一个 die 消息。

另请参见:
AbstractUndoableEdit.die()

trimForLimit

protected void trimForLimit()
以下一个编辑的索引为中心,将已排队编辑的数量减少到限制的大小范围内。


trimEdits

protected void trimEdits(int from,
                         int to)
移除指定范围内的编辑。对给定范围内的所有编辑(包括两端,以相反顺序)调用 die, 并从编辑列表中移除它们。如果 from > to,则此方法没有任何效果。

参数:
from - 要移除的最小索引
to - 要移除的最大索引

setLimit

public void setLimit(int l)
设置此 UndoManager 保持的最大编辑数。小于 0 的值指示编辑数不受限制。如果需要丢弃编辑以缩小限制,则将以添加编辑的相反顺序对其调用 die。默认值为 100。

参数:
l - 新的限制
抛出:
RuntimeException - 如果不再执行此 UndoManager(调用了 end
另请参见:
CompoundEdit.isInProgress(), end(), addEdit(javax.swing.undo.UndoableEdit), getLimit()

editToBeUndone

protected UndoableEdit editToBeUndone()
如果调用 undo,则返回下一个要撤消的有效编辑。如果没有要撤消的编辑,则此方法返回 null

返回:
下一个要撤消的有效编辑

editToBeRedone

protected UndoableEdit editToBeRedone()
如果调用 redo,则返回下一个要恢复的有效编辑。如果没有要恢复的编辑,则此方法返回 null

返回:
下一个要恢复的有效编辑

undoTo

protected void undoTo(UndoableEdit edit)
               throws CannotUndoException
撤消从下一个编辑的索引到 edit 的所有更改,适当地更新下一个编辑的索引。

抛出:
CannotUndoException - 如果其中一个编辑抛出 CannotUndoException

redoTo

protected void redoTo(UndoableEdit edit)
               throws CannotRedoException
恢复从下一个编辑的索引到 edit 的所有更改,适当地更新下一个编辑的索引。

抛出:
CannotUndoException - 如果其中一个编辑抛出 CannotUndoException
CannotRedoException

undoOrRedo

public void undoOrRedo()
                throws CannotRedoException,
                       CannotUndoException
一个便捷方法,它调用 undoredo。如果已撤消了所有编辑(下一个编辑的索引小于编辑列表的长度),则此方法调用 redo,否则调用 undo

抛出:
CannotUndoException - 如果其中一个编辑抛出 CannotUndoException
CannotRedoException - 如果其中一个编辑抛出 CannotRedoException
另请参见:
canUndoOrRedo(), getUndoOrRedoPresentationName()

canUndoOrRedo

public boolean canUndoOrRedo()
如果可以调用 undoredo,则返回 true。

返回:
如果调用 canUndoOrRedo 有效,则返回 true
另请参见:
undoOrRedo()

undo

public void undo()
          throws CannotUndoException
撤消适当的编辑。如果已调用了 end,则通过此方法调用超类,否则此方法对下一个编辑的索引和最后一个有效编辑之间的所有编辑调用 undo,适当地更新下一个编辑的索引。

指定者:
接口 UndoableEdit 中的 undo
覆盖:
CompoundEdit 中的 undo
抛出:
CannotUndoException - 如果其中一个编辑抛出 CannotUndoException 或没有要撤消的编辑
另请参见:
CompoundEdit.end(), canUndo(), editToBeUndone()

canUndo

public boolean canUndo()
如果可以撤消编辑,则返回 true。如果已调用了 end,则此方法返回来自超类的值。否则,如果有要撤消的编辑( editToBeUndone 返回非 null),则此方法返回 true。

指定者:
接口 UndoableEdit 中的 canUndo
覆盖:
CompoundEdit 中的 canUndo
返回:
如果有要撤消的编辑,则返回 true
另请参见:
CompoundEdit.canUndo(), editToBeUndone()

redo

public void redo()
          throws CannotRedoException
恢复适当的编辑。如果已调用了 end,则此方法调用超类,否则此方法对下一个编辑的索引和下一个有效编辑之间的所有编辑调用 redo,适当地更新下一个编辑的索引。

指定者:
接口 UndoableEdit 中的 redo
覆盖:
CompoundEdit 中的 redo
抛出:
CannotRedoException - 如果其中一个编辑抛出 CannotRedoException 或没有要恢复的编辑
另请参见:
CompoundEdit.end(), canRedo(), editToBeRedone()

canRedo

public boolean canRedo()
如果可以恢复编辑,则返回 true。如果已调用了 end,则此方法返回来自超类的值。否则,如果有要恢复的编辑( editToBeRedone 返回非 null),则此方法返回 true。

指定者:
接口 UndoableEdit 中的 canRedo
覆盖:
CompoundEdit 中的 canRedo
返回:
如果有要恢复的编辑,则返回 true
另请参见:
CompoundEdit.canRedo(), editToBeRedone()

addEdit

public boolean addEdit(UndoableEdit anEdit)
如果可能,将一个 UndoableEdit 添加到此 UndoManager。此方法移除从下一个编辑的索引到编辑列表结尾位置的所有编辑。如果已调用了 end,则不添加该编辑并返回 false。如果没有调用 end,则此方法返回 true

指定者:
接口 UndoableEdit 中的 addEdit
覆盖:
CompoundEdit 中的 addEdit
参数:
anEdit - 要添加的编辑
返回:
如果可以将 anEdit 合并到此编辑,则返回 true
另请参见:
CompoundEdit.end(), CompoundEdit.addEdit(javax.swing.undo.UndoableEdit)

end

public void end()
将此 UndoManager 转换为标准 CompoundEdit。这将移除所有已撤消的编辑。

覆盖:
CompoundEdit 中的 end
另请参见:
CompoundEdit.end()

getUndoOrRedoPresentationName

public String getUndoOrRedoPresentationName()
一个便捷方法,它返回 getUndoPresentationNamegetRedoPresentationName。如果下一个编辑的索引等于编辑列表的大小,则返回 getUndoPresentationName,否则返回 getRedoPresentationName

返回:
撤消或恢复的名称

getUndoPresentationName

public String getUndoPresentationName()
返回此编辑可撤消形式的描述。如果已调用了 end,则通过此方法调用超类。否则,如果有要撤消的编辑,则此方法返回下一个将要撤消的有效编辑的值。如果没有要撤消的编辑且没有调用 end,则此方法返回取自 UIManager 属性“AbstractUndoableEdit.undoText”的值。

指定者:
接口 UndoableEdit 中的 getUndoPresentationName
覆盖:
CompoundEdit 中的 getUndoPresentationName
返回:
此编辑可撤消形式的描述
另请参见:
undo(), CompoundEdit.getUndoPresentationName()

getRedoPresentationName

public String getRedoPresentationName()
返回此编辑可恢复形式的描述。如果已调用了 end ,则此方法调用到超类。否则,如果有要恢复的编辑,此方法返回下一个将要恢复的有效编辑的值。如果没有要恢复的编辑且没有调用 end,则此方法返回取自 UIManager 属性“AbstractUndoableEdit.redoText”的值。

指定者:
接口 UndoableEdit 中的 getRedoPresentationName
覆盖:
CompoundEdit 中的 getRedoPresentationName
返回:
此编辑可恢复形式的描述
另请参见:
redo(), CompoundEdit.getRedoPresentationName()

undoableEditHappened

public void undoableEditHappened(UndoableEditEvent e)
一个 UndoableEditListener 方法。此方法使用 e.getEdit() 调用 addEdit

指定者:
接口 UndoableEditListener 中的 undoableEditHappened
参数:
e - 要从中添加 UndoableEditEventUndoableEditEvent
另请参见:
addEdit(javax.swing.undo.UndoableEdit)

toString

public String toString()
返回显示和标识此对象属性的字符串。

覆盖:
CompoundEdit 中的 toString
返回:
此对象的 String 表示形式

JavaTM Platform
Standard Ed. 6

提交错误或意见
有关更多的 API 参考资料和开发人员文档,请参阅 Java SE 开发人员文档。该文档包含更详细的、面向开发人员的描述,以及总体概述、术语定义、使用技巧和工作代码示例。

版权所有 2007 Sun Microsystems, Inc. 保留所有权利。 请遵守许可证条款。另请参阅文档重新分发政策