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