- 所有已实现的接口:
-
Serializable
,EventListener
,UndoableEditListener
,UndoableEdit
UndoManager
管理一个 UndoableEdits
列表,提供了撤销或重做适当编辑的方法。有两种方法可以将编辑添加到 UndoManager
中。直接使用 addEdit
方法添加编辑,或将 UndoManager
添加到支持 UndoableEditListener
的 bean 中。以下示例创建一个 UndoManager
并将其作为 UndoableEditListener
添加到一个 JTextField
中:
UndoManager undoManager = new UndoManager(); JTextField tf = ...; tf.getDocument().addUndoableEditListener(undoManager);
UndoManager
维护一个编辑的有序列表和下一个编辑的索引。下一个编辑的索引要么是当前编辑列表的大小,要么如果调用了 undo
,则对应于撤销的最后一个重要编辑的索引。当调用 undo
时,从下一个编辑的索引到最后一个重要编辑的所有编辑都会被撤销,顺序相反。例如,考虑一个包含以下编辑的 UndoManager
: A b c D。粗体字母表示重要编辑,斜体和斜体字母表示不重要编辑。
图1 |
如图1所示,如果刚刚添加了 D,则下一个编辑的索引将为4。调用 undo
导致在 D 上调用 undo
并将下一个编辑的索引设置为3(编辑 c),如下图所示。
图2 |
最后一个重要编辑是 A,因此再次调用 undo
会依次在 c、b 和 A 上调用 undo
,并将下一个编辑的索引设置为0,如下图所示。
图3 |
调用 redo
导致在下一个编辑的索引和下一个重要编辑之间(或列表末尾)的所有编辑上调用 redo
。继续前面的示例,如果调用了 redo
,则 redo
将依次在 A、b 和 c 上调用。此外,下一个编辑的索引设置为3(如图2所示)。
向 UndoManager
添加编辑会导致删除从下一个编辑的索引到列表末尾的所有编辑。继续前面的示例,如果添加了一个新编辑 e>,则编辑 D 将从列表中删除(在调用 die
后)。如果 c 没有被下一个编辑包含(c.addEdit(e)
返回 true),或者被其替换(e.replaceEdit(c)
返回 true),则新编辑将添加在 c 之后,如下图所示。
图4 |
一旦在 UndoManager
上调用了 end
,则所有 UndoableEdit
方法都将使用超类行为。有关其行为的更多详细信息,请参阅 CompoundEdit
。
与 Swing 的其余部分不同,此类是线程安全的。
警告: 此类的序列化对象将不兼容未来的 Swing 版本。当前的序列化支持适用于短期存储或在运行相同 Swing 版本的应用程序之间的 RMI。从 1.4 版开始,已将所有 JavaBeans 的长期存储支持添加到 java.beans
包中。请参阅 XMLEncoder
。
-
Field Summary
Fields declared in class javax.swing.undo.CompoundEdit
edits
Fields declared in class javax.swing.undo.AbstractUndoableEdit
RedoName, UndoName
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionboolean
addEdit
(UndoableEdit anEdit) 如果可能,将一个UndoableEdit
添加到此UndoManager
中。boolean
canRedo()
如果可以重做编辑,则返回 true。boolean
canUndo()
如果可以撤销编辑,则返回 true。boolean
如果可以调用undo
或redo
,则返回 true。void
清空撤销管理器,在此过程中向每个编辑发送一个die
消息。protected UndoableEdit
如果调用redo
,则返回要重做的下一个重要编辑。protected UndoableEdit
如果调用undo
,则返回要撤销的下一个重要编辑。void
end()
将此UndoManager
转换为普通的CompoundEdit
。int
getLimit()
返回此UndoManager
持有的编辑的最大数量。返回此编辑的可重做形式的描述。返回getUndoPresentationName
或getRedoPresentationName
中的一个描述。返回此编辑的可撤销形式的描述。void
redo()
重做适当的编辑。protected void
redoTo
(UndoableEdit edit) 重做从下一个编辑的索引到edit
的所有更改,适当更新下一个编辑的索引。void
setLimit
(int l) 设置此UndoManager
持有的编辑的最大数量。toString()
返回显示和标识此对象属性的字符串。protected void
trimEdits
(int from, int to) 删除指定范围内的编辑。protected void
将排队的编辑数量减少到一个大小限制的范围,以下一个编辑的索引为中心。void
undo()
撤销适当的编辑。void
一个UndoableEditListener
方法。void
调用undo
或redo
中的一个方便方法。protected void
undoTo
(UndoableEdit edit) 从下一个编辑的索引到edit
撤销所有更改,适当更新下一个编辑的索引。Methods declared in class javax.swing.undo.CompoundEdit
die, getPresentationName, isInProgress, isSignificant, lastEdit
Methods declared in class javax.swing.undo.AbstractUndoableEdit
replaceEdit
-
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
如果调用undo
,则返回要撤销的下一个重要编辑。如果没有要撤销的编辑,则返回null
。- 返回:
- 要撤销的下一个重要编辑
-
editToBeRedone
如果调用redo
,则返回要重做的下一个重要编辑。如果没有要重做的编辑,则返回null
。- 返回:
- 要重做的下一个重要编辑
-
undoTo
从下一个编辑的索引到edit
撤销所有更改,适当更新下一个编辑的索引。- 参数:
-
edit
- 要撤销的编辑 - 抛出:
-
CannotUndoException
- 如果其中一个编辑引发CannotUndoException
-
redoTo
从下一个编辑的索引到edit
重做所有更改,适当更新下一个编辑的索引。- 参数:
-
edit
- 要重做的编辑 - 抛出:
-
CannotRedoException
- 如果其中一个编辑引发CannotRedoException
-
undoOrRedo
便利方法,调用undo
或redo
之一。如果有任何编辑被撤消(下一个编辑的索引小于编辑列表的长度),则调用redo
,否则调用undo
。- 抛出:
-
CannotUndoException
- 如果其中一个编辑引发CannotUndoException
-
CannotRedoException
- 如果其中一个编辑引发CannotRedoException
- 参见:
-
canUndoOrRedo
public boolean canUndoOrRedo()返回true,如果可以调用undo
或redo
。- 返回:
-
如果调用
canUndoOrRedo
有效,则返回true - 参见:
-
undo
撤消适当的编辑。如果已调用end
,则调用超类,否则在下一个编辑的索引和最后一个重要编辑之间的所有编辑上调用undo
,适当更新下一个编辑的索引。- 指定者:
-
undo
在接口UndoableEdit
中 - 覆盖:
-
undo
在类CompoundEdit
中 - 抛出:
-
CannotUndoException
- 如果其中一个编辑引发CannotUndoException
或没有要撤消的编辑 - 参见:
-
canUndo
public boolean canUndo()返回true,如果可以撤消编辑。如果已调用end
,则返回超类的值。否则,如果有任何要撤消的编辑(editToBeUndone
返回非null
),则返回true。- 指定者:
-
canUndo
在接口UndoableEdit
中 - 覆盖:
-
canUndo
在类CompoundEdit
中 - 返回:
- 如果有要撤消的编辑,则返回true
- 参见:
-
redo
重做适当的编辑。如果已调用end
,则调用超类。否则,在下一个编辑的索引和下一个重要编辑之间的所有编辑上调用redo
,适当更新下一个编辑的索引。- 指定者:
-
redo
在接口UndoableEdit
中 - 覆盖:
-
redo
在类CompoundEdit
中 - 抛出:
-
CannotRedoException
- 如果其中一个编辑引发CannotRedoException
或没有要重做的编辑 - 参见:
-
canRedo
public boolean canRedo()返回true,如果可以重做编辑。如果已调用end
,则返回超类的值。否则,如果有任何要重做的编辑(editToBeRedone
返回非null
),则返回true。- 指定者:
-
canRedo
在接口UndoableEdit
中 - 覆盖:
-
canRedo
在类CompoundEdit
中 - 返回:
- 如果有要重做的编辑,则返回true
- 参见:
-
addEdit
将一个UndoableEdit
添加到这个UndoManager
,如果可能的话。这将删除从下一个编辑的索引到编辑列表末尾的所有编辑。如果已调用end
,则不添加编辑并返回false
。如果未调用end
,则返回true
。- 指定者:
-
addEdit
在接口UndoableEdit
中 - 覆盖:
-
addEdit
在类CompoundEdit
中 - 参数:
-
anEdit
- 要添加的编辑 - 返回:
-
如果
anEdit
可以合并到此编辑中,则返回true - 参见:
-
end
public void end()将这个UndoManager
转换为普通的CompoundEdit
。这将删除所有已经撤消的编辑。- 覆盖:
-
end
在类CompoundEdit
中 - 参见:
-
getUndoOrRedoPresentationName
便利方法,返回getUndoPresentationName
或getRedoPresentationName
。如果下一个编辑的索引等于编辑列表的大小,则返回getUndoPresentationName
,否则返回getRedoPresentationName
。- 返回:
- 撤消或重做名称
-
getUndoPresentationName
返回此编辑的可撤销形式的描述。如果已调用end
,则调用超类。否则,如果有要撤消的编辑,则返回将要撤消的下一个重要编辑的值。如果没有要撤消的编辑且未调用end
,则返回UIManager
属性"AbstractUndoableEdit.undoText"的值。- 指定者:
-
getUndoPresentationName
在接口UndoableEdit
中 - 覆盖:
-
getUndoPresentationName
在类CompoundEdit
中 - 返回:
- 此编辑的可撤销形式的描述
- 参见:
-
getRedoPresentationName
返回此编辑的可重做形式的描述。如果已调用end
,则调用超类。否则,如果有要重做的编辑,则返回将要重做的下一个重要编辑的值。如果没有要重做的编辑且未调用end
,则返回UIManager
属性"AbstractUndoableEdit.redoText"的值。- 指定者:
-
getRedoPresentationName
在接口UndoableEdit
中 - 覆盖:
-
getRedoPresentationName
在类CompoundEdit
中 - 返回:
- 此编辑的可重做形式的描述
- 参见:
-
undoableEditHappened
一个UndoableEditListener
方法。这将使用e.getEdit()
调用addEdit
。- 指定者:
-
undoableEditHappened
在接口UndoableEditListener
中 - 参数:
-
e
- 将从中添加UndoableEditEvent
的UndoableEditEvent
- 参见:
-
toString
返回显示和标识此对象属性的字符串。- 覆盖:
-
toString
在类CompoundEdit
- 返回:
- 该对象的字符串表示形式
-