Реализуйте отмену / повтор для вкладок JEditorPanes - PullRequest
0 голосов
/ 21 января 2012

Я занимаюсь разработкой базового редактора в своем приложении, который позволяет просматривать несколько компонентов в 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);

Спасибо и наилучшими пожеланиями

Andreas

1 Ответ

0 голосов
/ 21 января 2012

Обычно для отмены функций вы можете использовать шаблон команды.

Проверьте это:

http://www.javaworld.com/javaworld/jw-06-1998/jw-06-undoredo.html

http://www.javaworld.com/javaworld/javatips/jw-javatip68.html

http://twit88.com/blog/2008/01/26/design-pattern-in-java-101-command-pattern-behavioral-pattern/

...