我正在我的应用程序中开发一个基本编辑器,它允许在 JTabbedPane 中查看多个组件。每个选项卡都包含一个 JScrollPane,其中包含一个 JEditorPane。
现在我想实现一个撤消和重做功能。因此,如果我按下工具栏中的撤消或重做按钮或使用定义的击键,我希望 UndoManager 撤消或重做我在当前查看的文档中的最后一次编辑。
有几个教程,比如这个,关于如何为单个文档或文本组件而不是完整的文档堆栈执行此操作。你有什么想法。
我尝试了以下。我像这样实现了 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);
谢谢和最好的问候
安德烈亚斯