为选项卡式JEditorPanes实现撤消/重做

时间:2012-01-21 17:44:08

标签: java swing jeditorpane jtabbedpane jtextcomponent

我正在我的应用程序中开发一个基本编辑器,它允许查看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);

谢谢&最好的问候

安德烈亚斯