2012-10-07 78 views
3

我無法理解使用UndoManager的撤銷/重做功能,並將其與MVC模型集成在一起。如何在Java中爲MVC模型實現撤銷/重做?

我不知道在哪裏把各種方法(在模型,視圖或控制) ,我仍然不知道如何使用撤消管理器。

我的控制類實現UndoableEditListener該 它創建:

private UndoManager manager = new UndoManager(); 

和:

public void actionPerformed(ActionEvent e) { 
    if (e.getActionCommand().equals("Undo")) {  
     try { 
      manager.undo(); 
     } catch (CannotUndoException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

我明白了這裏,但其餘的我不知道該怎麼做。我知道我將不得不在模型和視圖類中添加更多,但不知道在哪裏。 我必須擁有以下課程嗎?

public class UndoAction extends AbstractAction {} 

public void undoableEditHappened(UndoableEditEvent e) { 

我只是把一個文本框一個整數,然後我希望能夠撤消this.I設置在視圖class.I文本字段數量都想達致這可能是最簡單的方法,沒有花哨的編碼!這是我assg的一小部分,但我不能讓它工作!

============================================== ============ 下面是我的代碼的更詳細的描述,也許它會幫助:我有一個模型,視圖和控制包。

控逆變具有: ButtonGUIControl.java,它實現既

ActionListener and 
    UndoableEditListener. 


    final UndoManager manager = new UndoManager(); 

在actionPerformed方法,它調用

if (e.getActionCommand().equals("Undo")){ 

      try { 

        manager.undo(); 
       } 

和在:

public void undoableEditHappened(UndoableEditEvent evt) { 
      manager.addEdit(evt.getEdit()); 

}

在查看: Grid.java,它擴展了JTextField將新增如下,無論它需要在GUI上顯示一個數字:(模型只是我的模型類的實例)

getDocument().addUndoableEditListener(new ButtonGUIControl(model)); 

莫非是因爲UndoManager是在不同的包中創建的?我真的不知道如何調試這個了!

如果有幫助,我可以發佈我的整個代碼。我想我不知道如何將這與我的mvc模型結構集成。

+0

這可能會有幫助http://www.java-tips.org/java-se-tips/javax.swing.undo/how-to-add-undo-和-reoo-to-a-text-comp.html –

回答

3

退後一秒。這裏的整個想法是,用戶將使用您的應用程序,並會對某些內容進行一系列更改。文本編輯器就是一個很好的例子。您可以插入字符和行,再次刪除它們,用其他文本替換文本,滾動文本等。爲了支持MVC,您有一個保存狀態的模型和一個顯示它的視圖。

您的第一個直覺可能是讓視圖直接訪問模型,然後每次用戶進行更改時刷新視圖,但很難通過該實現撤消這些更改。相反,您需要編碼用戶可以在能夠執行該更改並且以後可以撤消該更改的類中進行的每種更改。

例如,插入文本的操作將通過知道插入點的字符偏移量和要插入的字符串的類來實現。執行操作會將該字符串插入到偏移量處,撤消操作會在該插入點之後移除正確數量的字符。你會有一個不同的類來處理刪除,另一個可以處理滾動等。

每當用戶採取一些行動時,視圖將構造這些UndoableEdit類之一,並告訴實例自己運行(重做( ))。一旦執行,您將該UndoableEdit放在UndoableEdit實例列表的末尾,該實例表示用戶迄今採取的所有操作。這個列表可以很容易地支持任何撤消請求,重做請求和實際編輯操作(導致更多的UndoableEdit放在列表中)。

所以回到你的問題。如果您的應用程序需要支持撤消和重做,那麼您需要實現一個UndoManager,它只是簡單地管理UndoableEdit列表並根據需要執行撤消和重做。你還必須實現一大堆的UndoableEdits,一個用於你的用戶針對UI所做的每種事情。至於聽衆,我看不到你真的需要那樣做。

+0

Swing已經有一個UndoManager類,不需要實現它:http://docs.oracle.com/javase/6/docs/api/javax/swing/undo /UndoManager.html – lbalazscs

2
  1. 如果您只需要簡單的撤銷/重做,您可以按原樣使用UndoManager,您不需要以任何方式進行子類化或定製。
  2. JTextField中(更具體的模型中,Document)有一些內置的撤銷,這意味着你不需要任何寫UndoableEdit實現支持,UndoableEdit中的對象將被自動地爲您創建(實際上AbstractDocument.DefaultDocumentEvent實現UndoableEdit中的) 。
  3. 全部簡單工作的例子是here
+0

感謝您的幫助。我試圖修復我的代碼,我認爲它的權利,除了我仍然得到: javax.swing.undo.UndoManager.undo(未知源) 有沒有辦法找出問題的確切位置?我試過打印 manager.canUndo()和我得到假 再次感謝! – greg

+0

我不明白,你是否得到例外?無論如何,我建議你用代碼問一個關於新問題的新問題。如果你原來的問題得到回答,你應該接受的答案:) – lbalazscs

+0

是的,我得到一個異常: javax.swing.undo.CannotUndoException \t在javax.swing.undo.UndoManager.undo(的UndoManager。 java:411) 它發生在我的程序調用時: manager.undo(); 我還會問一個新問題:) – greg