Module  java.desktop
软件包  javax.swing.undo

Class UndoManager

  • All Implemented Interfaces:
    SerializableEventListenerUndoableEditListenerUndoableEdit


    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 D。 粗体大写字母的编辑是重要的,小写和斜体的编辑是微不足道的。

    Figure 1 Figure 1

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

    Figure 2 Figure 2

    最后显著编辑是A,以使得调用undo再次调用undo上和A,在该顺序中,下一个编辑的索引设置为0,如图如下图。

    Figure 3 Figure 3

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

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

    Figure 4 Figure 4

    一旦end被调用了一个UndoManager超类行为被用于所有UndoableEdit方法。 有关其行为的更多细节,请参阅CompoundEdit

    与其他Swing不同,这个类是线程安全的。

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

    另请参见:
    Serialized Form
    • 构造方法详细信息

      • 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 - 要删除的最大索引
      • 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
      • canUndoOrRedo

        public boolean canUndoOrRedo​()
        如果可以调用 undoredo ,则返回true。
        结果
        如果调用 canUndoOrRedo有效, canUndoOrRedo true
        另请参见:
        undoOrRedo()
      • canUndo

        public boolean canUndo​()
        如果编辑可能被撤销,则返回true。 如果调用了end ,则返回值为super。 否则,如果有任何编辑被撤销,则返回true( editToBeUndone返回非null )。
        Specified by:
        canUndo在接口 UndoableEdit
        重写:
        canUndoCompoundEdit
        结果
        如果编辑被撤销,则为true
        另请参见:
        CompoundEdit.canUndo()editToBeUndone()
      • canRedo

        public boolean canRedo​()
        如果编辑可能会重做,则返回true。 如果调用了end ,则返回超级值。 否则,如果有任何编辑要重做,则返回true( editToBeRedone返回非null )。
        Specified by:
        canRedo在接口 UndoableEdit
        重写:
        canRedoCompoundEdit
        结果
        如果编辑被重做,则为true
        另请参见:
        CompoundEdit.canRedo()editToBeRedone()
      • end

        public void end​()
        将这UndoManager变成一个正常的CompoundEdit 这将删除所有已被撤销的编辑。
        重写:
        endCompoundEdit
        另请参见:
        CompoundEdit.end()
      • getUndoOrRedoPresentationName

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

        public String getRedoPresentationName​()
        返回此修改的可重写形式的描述。 如果已经调用了end则调用此超级。 否则,如果编辑被重做,则返回重新编辑的下一个重要编辑的值。 如果没有编辑被重做,并且end未被调用,则返回UIManager属性“AbstractUndoableEdit.redoText”中的值。
        Specified by:
        getRedoPresentationName在接口 UndoableEdit
        重写:
        getRedoPresentationName中的 CompoundEdit
        结果
        对该编辑的可重写形式的描述
        另请参见:
        redo()CompoundEdit.getRedoPresentationName()
      • toString

        public String toString​()
        返回显示和标识此对象属性的字符串。
        重写:
        toStringCompoundEdit
        结果
        该对象的字符串表示形式