2012-01-21 75 views
-1

我发展我的应用程序,它允许一个JTabbedPane的内查看多个组件中的基本编辑器。每个选项卡都包含一个包含JEditorPane的JScrollPane。实现撤销/重做标签JEditorPanes

现在我想实现的撤消和重做功能。因此,如果我按下我的工具栏中的撤消或重做按钮或使用定义的按键,我希望UndoManager撤消或重做当前查看文档中的最后编辑。

有几个教程,像this one,如何做到这一点的一个单一的文件或文本组件而不是一个完整的文件堆栈。你有什么想法。

我尝试以下。我实现了UndoHandler,撤消和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); 

感谢&问候

安德烈亚斯

+2

的[SSCCE(http://sscce.org)将有很大的帮助。 –

+1

我不明白,这对一堆文件来说是一样的。每个都会有自己的'UndoManager'和'UndoHandler'。 – stryba

+0

我添加了我最近的测试。但我不明白你的意思。你能举个简单的例子吗? – Phidelux

回答

0
+0

感谢这个链接,但我已经知道了命令模式,并没有在这种情况下帮助,因为我只是想撤销和重做基本的文本操作。该功能已在文本组件中实现。我只是不知道如何将它与多个文档同时使用。 – Phidelux

+0

呃..对不起,很急,没有仔细阅读.. :) –