我正在我的应用程序中开发一个基本编辑器,它允许查看JTabbedPane中的几个组件。每个选项卡都包含一个包含JEditorPane的JScrollPane。
现在我想实现撤消和重做功能。因此,如果我按下工具栏中的撤消或重做按钮或使用定义的按键,我希望UndoManager撤消或重做我当前查看的文档中的上一次编辑。
有几个教程,如this one,有关如何为单个文档或文本组件执行此操作,但不适用于完整文档堆栈。你有什么想法。
我尝试了以下内容。我像这样实现了UndoHandler,Undo和RedoAction ......
class UndoHandler implements UndoableEditListener {
public void undoableEditHappened(UndoableEditEvent e) {
undoManager.addEdit(e.getEdit());
undoAction.update();
redoAction.update();
}
}
class UndoAction extends AbstractAction {
public UndoAction() {
super("Undo");
setEnabled(false);
}
public void actionPerformed(ActionEvent e) {
try {
undoManager.undo();
} catch (CannotUndoException ex) {
ex.printStackTrace();
}
update();
redoAction.update();
}
protected void update() {
if (undoManager.canUndo()) {
setEnabled(true);
putValue(Action.NAME, undoManager.getUndoPresentationName());
} else {
setEnabled(false);
putValue(Action.NAME, "Undo");
}
}
}
class RedoAction extends AbstractAction {
public RedoAction() {
super("Redo");
setEnabled(false);
}
public void actionPerformed(ActionEvent e) {
try {
undoManager.redo();
} catch (CannotRedoException ex) {
ex.printStackTrace();
}
update();
undoAction.update();
}
protected void update() {
if (undoManager.canRedo()) {
setEnabled(true);
putValue(Action.NAME, undoManager.getRedoPresentationName());
} else {
setEnabled(false);
putValue(Action.NAME, "Redo");
}
}
}
...并将其分配给每个文档:
// Fetch the under laying document ...
ObjDocument doc = (ObjDocument) editor.getDocument();
// ... and assign the undo listener.
doc.addUndoableEditListener(undoHandler);
谢谢&最好的问候
安德烈亚斯