2010-01-12 48 views
0

我需要寫這3個函數,但是我被卡在重做和刪除。當沒有任何重做時,重做顯示錯誤,我不知道如何編寫刪除功能。謝謝在java中撤消,重做,刪除函數

撤消

public class Undo extends AbstractAction { 

private MyCanvas myCanvas; 

public Undo(MyCanvas myCanvas) { 
    this.myCanvas = myCanvas; 
    this.putValue(NAME, "Undo"); 
    this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl Z")); 
    this.putValue(SMALL_ICON, new ImageIcon(Main.class.getResource("/icons/Undo24.gif"))); 
} 

public void actionPerformed(ActionEvent e) { 
    if (!myCanvas.commands.isEmpty()) { 

     Command cmd = myCanvas.commands.pop(); 
     cmd.undo(); 
     myCanvas.undoneCommands.add(cmd); 
     myCanvas.repaint(); 
    } 
      else 
       System.out.println(); 
} 
} 

重做

public class Redo extends AbstractAction { 

private MyCanvas myCanvas; 

public Redo(MyCanvas myCanvas) { 
    this.myCanvas = myCanvas; 
    this.putValue(NAME, "Redo"); 
    this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("ctrl Y")); 
    this.putValue(SMALL_ICON, new ImageIcon(Main.class.getResource("/icons/Redo16.gif"))); 
} 

public void actionPerformed(ActionEvent e) { 
    //if (!myCanvas.commands.isEmpty()) { 
     Command cmd = myCanvas.undoneCommands.pop(); 
     cmd.execute(); 
     myCanvas.commands.add(cmd); 
     myCanvas.repaint(); 
    //} 
     // else 
       System.out.println(); 
} 
} 
+0

無關的,但爲什麼你把方法調用的前面?它不表示任何東西。 – 2010-01-12 20:16:37

+0

爲了確保代碼被格式化爲代碼,在其前面至少放置四個空格。 (我進去了,爲你改變了這個。) – 2010-01-19 09:17:54

回答

1

我相信你會想看看在command pattern

有關於這方面的書Head First設計模式的好寫了爲好。

+0

我想我不能得到更具體的答案:) – ivan 2010-01-12 18:28:37

+0

@ivan是的,你可以。去圖書館,或者當地的Barns and Noble,閱讀有關Command Pattern的內容。 等待;你瞭解UML嗎? (原因瞭解,如果你知道一點點UML它將幫助,主要是,如何閱讀類圖) 相信我,你會很高興你提出學習它的努力! – leeand00 2010-01-12 18:34:58

1

這是一個很難解決一般問題 - 如果它很容易將是在庫中。

一種方法是讓每個「動作」都是一個類。例如,「添加文本」類可能會在給定位置向屏幕添加多個字符。這個對象是在你輸入的時候創建的,並且當它完成時被壓入堆棧(可能是你想爲每個字符創建一個對象)。

訣竅是每個「Action」也有一個可以撤消自身的undo方法。 ();

通過這種方式,刪除函數會知道它應該刪除當前選中的文本,它會記錄位置和文本本身已被刪除,坐在堆棧,如果你要調用它的撤銷,它只會放置文本回文檔。

它看起來像你正在嘗試做沿着這些線路,但沒有的東西爲每個可以影響文檔的操作類型(AddCharacter,Delete,EraseDocument,...)創建一個不同的對象。這是可行的 - 這就是你用非OO語言來做這件事的方式,但它不容易或不乾淨 - 例如,你必須存儲任意的元數據,比如刪除的文本,刪除的位置,等等。到你的堆棧的一部分。

當你把它分解成小的動作,它變得非常有趣和容易...

+0

@Bill你的解釋比我告訴他的更好,但你基本上是指正確的命令模式? (至少在參考面向對象的東西) (表示對比爾的12K謙虛崇敬(我所有的都是2k)) – leeand00 2010-01-12 18:44:28

+1

是的,我只是試圖調整他的問題,並給他一個想法,爲什麼它是有用的。 – 2010-01-12 20:59:52

0

我寫了一個簡單的Java撤銷/重做框架。沒有外部依賴關係,它完全免費。 「這個」在Try it out