-1

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

谢谢和最好的问候

安德烈亚斯

4

1 回答 1