模块 java.desktop

类 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 结果调用 undoD并将下一次编辑的索引设置为 3(编辑c),如下图所示。

图 2
图 2

最后的重要编辑是A, 因此调用 undo 再次调用 undo onc, b, 和A, 依次将下一次编辑的索引设置为0,如下图所示。

图 3
图 3

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

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

图 4
图 4

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

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

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

  • 构造方法详细信息

    • UndoManager

      public UndoManager()
      创建一个新的 UndoManager
  • 方法详情

    • 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()
      如果可以调用 undoredo 则返回 true。
      返回:
      如果调用 canUndoOrRedo 有效则为真
      参见:
    • undo

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

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

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

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

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

      public void end()
      把这个 UndoManager 变成一个普通的 CompoundEdit 。这将删除所有已撤消的编辑。
      重写:
      end 在类 CompoundEdit
      参见:
    • getUndoOrRedoPresentationName

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

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

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

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

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