Java 对选项卡式窗格执行撤消/重做
我正在我的应用程序中开发一个基本编辑器,它允许在JTabbedPane中查看多个组件。每个选项卡都包含一个JScrollPane,其中包含一个JEditorPane 现在我想实现一个撤销和重做功能。因此,如果我按下工具栏中的“撤消”或“重做”按钮或使用定义的击键,我希望UndoManager撤消或重做当前查看文档中的上一次编辑 有几个教程,例如,关于如何对单个文档或文本组件执行此操作,而不是对整个文档堆栈执行此操作。你有什么想法吗 我尝试了以下方法。我实现了UndoHandler、Undo和RedoAction,如下所示Java 对选项卡式窗格执行撤消/重做,java,swing,jeditorpane,jtabbedpane,jtextcomponent,Java,Swing,Jeditorpane,Jtabbedpane,Jtextcomponent,我正在我的应用程序中开发一个基本编辑器,它允许在JTabbedPane中查看多个组件。每个选项卡都包含一个JScrollPane,其中包含一个JEditorPane 现在我想实现一个撤销和重做功能。因此,如果我按下工具栏中的“撤消”或“重做”按钮或使用定义的击键,我希望UndoManager撤消或重做当前查看文档中的上一次编辑 有几个教程,例如,关于如何对单个文档或文本组件执行此操作,而不是对整个文档堆栈执行此操作。你有什么想法吗 我尝试了以下方法。我实现了UndoHandler、Undo和Re
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通常,要获得撤销功能,可以使用命令模式 看看这个:
An会有很大帮助。我不明白,一堆文档也是如此。每个都有自己的
UndoManager
和undomhandler
。但我不明白你的意思。你能举个简短的例子吗?@Avedo:没错,你能举个简短的例子吗?一我们将确切地知道你的问题所在。如果我正在锁定解决方案,很难给出一个简短的示例。我没有代码,这并没有达到预期的效果。我需要一个想法如何实现撤销和重做功能的一个以上的文件。所有的例子都展示了如何在一个文档中实现这一点。感谢这些链接,但是我已经知道了命令模式,在这种情况下它没有帮助,因为我只想撤销和重做基本的文本操作。此功能已在文本组件中实现。我只是不知道如何将它同时用于多个文档。