アプリケーション内で基本的なエディターを開発しています。これにより、JTabbedPane内のいくつかのコンポーネントを表示できます。各タブには、JEditorPaneを含むJScrollPaneがあります。
ここで、元に戻す機能とやり直し機能を実装したいと思います。したがって、ツールバーの[元に戻す]または[やり直し]ボタンを押すか、定義されたキーストロークを使用する場合、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);
感謝をこめて
アンドレアス