Module java.desktop
Package javax.swing.undo

Class UndoManager

所有已实现的接口:
Serializable, EventListener, UndoableEditListener, UndoableEdit

public class UndoManager extends CompoundEdit implements UndoableEditListener
UndoManager 管理一个 UndoableEdits 列表,提供了撤销或重做适当编辑的方法。有两种方法可以将编辑添加到 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。粗体字母表示重要编辑,斜体和斜体字母表示不重要编辑。

图1
图1

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

图2
图2

最后一个重要编辑是 A,因此再次调用 undo 会依次在 cbA 上调用 undo,并将下一个编辑的索引设置为0,如下图所示。

图3
图3

调用 redo 导致在下一个编辑的索引和下一个重要编辑之间(或列表末尾)的所有编辑上调用 redo。继续前面的示例,如果调用了 redo,则 redo 将依次在 Abc 上调用。此外,下一个编辑的索引设置为3(如图2所示)。

UndoManager 添加编辑会导致删除从下一个编辑的索引到列表末尾的所有编辑。继续前面的示例,如果添加了一个新编辑 e>,则编辑 D 将从列表中删除(在调用 die 后)。如果 c 没有被下一个编辑包含(c.addEdit(e) 返回 true),或者被其替换(e.replaceEdit(c) 返回 true),则新编辑将添加在 c 之后,如下图所示。

图4
图4

一旦在 UndoManager 上调用了 end,则所有 UndoableEdit 方法都将使用超类行为。有关其行为的更多详细信息,请参阅 CompoundEdit

与 Swing 的其余部分不同,此类是线程安全的。

警告: 此类的序列化对象将不兼容未来的 Swing 版本。当前的序列化支持适用于短期存储或在运行相同 Swing 版本的应用程序之间的 RMI。从 1.4 版开始,已将所有 JavaBeans 的长期存储支持添加到 java.beans 包中。请参阅 XMLEncoder

  • Constructor Details

    • UndoManager

      public UndoManager()
      创建一个新的 UndoManager
  • Method Details

    • getLimit

      public int getLimit()
      返回此 UndoManager 持有的编辑的最大数量。小于 0 的值表示编辑数量没有限制。
      返回:
      UndoManager 持有的编辑的最大数量
      参见:
    • discardAllEdits

      public void discardAllEdits()
      清空撤销管理器,在此过程中向每个编辑发送一个 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
      参见:
    • editToBeUndone

      protected UndoableEdit editToBeUndone()
      如果调用 undo,则返回要撤销的下一个重要编辑。如果没有要撤销的编辑,则返回 null
      返回:
      要撤销的下一个重要编辑
    • editToBeRedone

      protected UndoableEdit editToBeRedone()
      如果调用 redo,则返回要重做的下一个重要编辑。如果没有要重做的编辑,则返回 null
      返回:
      要重做的下一个重要编辑
    • undoTo

      protected void undoTo(UndoableEdit edit) throws CannotUndoException
      从下一个编辑的索引到 edit 撤销所有更改,适当更新下一个编辑的索引。
      参数:
      edit - 要撤销的编辑
      抛出:
      CannotUndoException - 如果其中一个编辑引发 CannotUndoException
    • redoTo

      protected void redoTo(UndoableEdit edit) throws CannotRedoException
      从下一个编辑的索引到 edit 重做所有更改,适当更新下一个编辑的索引。
      参数:
      edit - 要重做的编辑
      抛出:
      CannotRedoException - 如果其中一个编辑引发 CannotRedoException
    • undoOrRedo

      public void undoOrRedo() throws CannotRedoException, CannotUndoException
      便利方法,调用undoredo之一。如果有任何编辑被撤消(下一个编辑的索引小于编辑列表的长度),则调用redo,否则调用undo
      抛出:
      CannotUndoException - 如果其中一个编辑引发CannotUndoException
      CannotRedoException - 如果其中一个编辑引发CannotRedoException
      参见:
    • canUndoOrRedo

      public boolean canUndoOrRedo()
      返回true,如果可以调用undoredo
      返回:
      如果调用canUndoOrRedo有效,则返回true
      参见:
    • undo

      public void undo() throws CannotUndoException
      撤消适当的编辑。如果已调用end,则调用超类,否则在下一个编辑的索引和最后一个重要编辑之间的所有编辑上调用undo,适当更新下一个编辑的索引。
      指定者:
      undo 在接口 UndoableEdit
      覆盖:
      undo 在类 CompoundEdit
      抛出:
      CannotUndoException - 如果其中一个编辑引发CannotUndoException或没有要撤消的编辑
      参见:
    • canUndo

      public boolean canUndo()
      返回true,如果可以撤消编辑。如果已调用end,则返回超类的值。否则,如果有任何要撤消的编辑(editToBeUndone返回非null),则返回true。
      指定者:
      canUndo 在接口 UndoableEdit
      覆盖:
      canUndo 在类 CompoundEdit
      返回:
      如果有要撤消的编辑,则返回true
      参见:
    • redo

      public void redo() throws CannotRedoException
      重做适当的编辑。如果已调用end,则调用超类。否则,在下一个编辑的索引和下一个重要编辑之间的所有编辑上调用redo,适当更新下一个编辑的索引。
      指定者:
      redo 在接口 UndoableEdit
      覆盖:
      redo 在类 CompoundEdit
      抛出:
      CannotRedoException - 如果其中一个编辑引发CannotRedoException或没有要重做的编辑
      参见:
    • canRedo

      public boolean canRedo()
      返回true,如果可以重做编辑。如果已调用end,则返回超类的值。否则,如果有任何要重做的编辑(editToBeRedone返回非null),则返回true。
      指定者:
      canRedo 在接口 UndoableEdit
      覆盖:
      canRedo 在类 CompoundEdit
      返回:
      如果有要重做的编辑,则返回true
      参见:
    • addEdit

      public boolean addEdit(UndoableEdit anEdit)
      将一个UndoableEdit添加到这个UndoManager,如果可能的话。这将删除从下一个编辑的索引到编辑列表末尾的所有编辑。如果已调用end,则不添加编辑并返回false。如果未调用end,则返回true
      指定者:
      addEdit 在接口 UndoableEdit
      覆盖:
      addEdit 在类 CompoundEdit
      参数:
      anEdit - 要添加的编辑
      返回:
      如果anEdit可以合并到此编辑中,则返回true
      参见:
    • end

      public void end()
      将这个UndoManager转换为普通的CompoundEdit。这将删除所有已经撤消的编辑。
      覆盖:
      end 在类 CompoundEdit
      参见:
    • getUndoOrRedoPresentationName

      public String getUndoOrRedoPresentationName()
      便利方法,返回getUndoPresentationNamegetRedoPresentationName。如果下一个编辑的索引等于编辑列表的大小,则返回getUndoPresentationName,否则返回getRedoPresentationName
      返回:
      撤消或重做名称
    • getUndoPresentationName

      public String getUndoPresentationName()
      返回此编辑的可撤销形式的描述。如果已调用end,则调用超类。否则,如果有要撤消的编辑,则返回将要撤消的下一个重要编辑的值。如果没有要撤消的编辑且未调用end,则返回UIManager属性"AbstractUndoableEdit.undoText"的值。
      指定者:
      getUndoPresentationName 在接口 UndoableEdit
      覆盖:
      getUndoPresentationName 在类 CompoundEdit
      返回:
      此编辑的可撤销形式的描述
      参见:
    • getRedoPresentationName

      public String getRedoPresentationName()
      返回此编辑的可重做形式的描述。如果已调用end,则调用超类。否则,如果有要重做的编辑,则返回将要重做的下一个重要编辑的值。如果没有要重做的编辑且未调用end,则返回UIManager属性"AbstractUndoableEdit.redoText"的值。
      指定者:
      getRedoPresentationName 在接口 UndoableEdit
      覆盖:
      getRedoPresentationName 在类 CompoundEdit
      返回:
      此编辑的可重做形式的描述
      参见:
    • undoableEditHappened

      public void undoableEditHappened(UndoableEditEvent e)
      一个UndoableEditListener方法。这将使用e.getEdit()调用addEdit
      指定者:
      undoableEditHappened 在接口 UndoableEditListener
      参数:
      e - 将从中添加UndoableEditEventUndoableEditEvent
      参见:
    • toString

      public String toString()
      返回显示和标识此对象属性的字符串。
      覆盖:
      toString 在类 CompoundEdit
      返回:
      该对象的字符串表示形式