Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对选项卡式窗格执行撤消/重做_Java_Swing_Jeditorpane_Jtabbedpane_Jtextcomponent - Fatal编程技术网

Java 对选项卡式窗格执行撤消/重做

Java 对选项卡式窗格执行撤消/重做,java,swing,jeditorpane,jtabbedpane,jtextcomponent,Java,Swing,Jeditorpane,Jtabbedpane,Jtextcomponent,我正在我的应用程序中开发一个基本编辑器,它允许在JTabbedPane中查看多个组件。每个选项卡都包含一个JScrollPane,其中包含一个JEditorPane 现在我想实现一个撤销和重做功能。因此,如果我按下工具栏中的“撤消”或“重做”按钮或使用定义的击键,我希望UndoManager撤消或重做当前查看文档中的上一次编辑 有几个教程,例如,关于如何对单个文档或文本组件执行此操作,而不是对整个文档堆栈执行此操作。你有什么想法吗 我尝试了以下方法。我实现了UndoHandler、Undo和Re

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

通常,要获得撤销功能,可以使用命令模式

看看这个:


An会有很大帮助。我不明白,一堆文档也是如此。每个都有自己的
UndoManager
undomhandler
。但我不明白你的意思。你能举个简短的例子吗?@Avedo:没错,你能举个简短的例子吗?一我们将确切地知道你的问题所在。如果我正在锁定解决方案,很难给出一个简短的示例。我没有代码,这并没有达到预期的效果。我需要一个想法如何实现撤销和重做功能的一个以上的文件。所有的例子都展示了如何在一个文档中实现这一点。感谢这些链接,但是我已经知道了命令模式,在这种情况下它没有帮助,因为我只想撤销和重做基本的文本操作。此功能已在文本组件中实现。我只是不知道如何将它同时用于多个文档。