2012-04-09 61 views
2

我有一個名爲'行'的線對象的ArrayList。我製作了自己的線條類,用一些約束畫出線條。它涉及在面板中選擇兩個點,並繪製一條連接兩個點的線。每次創建一行時,都會將其添加到「行」中。線條繪製在一個面板中。撤消數組列表中的更改

在我的面板漆功能如下:

public void paintComponent(Graphics g){  

     super.paintComponent(g); 

     for(final Line r:lines){ 

      r.paint((Graphics2D)g); 

     } 
    } 

而且每次兩個點被點擊面板上,創建一個新的行。

class Board extends JPanel{ 

public void placeLine(){ 
    Point p1,p2; 
    JLabel l1,l2; 
    ... 
    lines.add(new Line(p1,p2,l1,l2)); 
    this.repaint(); 
} 
public void deleteLine(Line l){ 
    lines.remove(l); 
} 
} 

我想創建這樣的一個UndoableEdit中,每次我給撤消,撤消方法必須恢復到上次動作(i.e.creating線或刪除線)。我已經嘗試撤消JTextArea中的事件,但我無法弄清楚如何爲ArrayLists中的事件更改構建自定義撤消。建議做一個例子。

我真的很抱歉沒有將它作爲SSCCE發佈。這是一個巨大的項目,創建SSCCE幾乎是不可能的。

+0

你的deleteLine方法的工作? – guness 2012-04-09 08:20:18

+0

這可以幫助:http://stackoverflow.com/questions/3583901/how-to-design-undo-redo-in-text-editor – 2012-04-09 08:40:33

回答

0

我建議你閱讀關於Memento模式(http://en.wikipedia.org/wiki/Memento_pattern),然後在網上搜索一些使用這種模式的代碼示例。

+0

是的..謝謝!但我不知道設計模式雖然..有沒有什麼辦法可以做到這一點,而不使用設計模式? – 2012-04-09 08:27:19

+0

@SivaSubramaniam設計模式是基本知識。如果你從未使用過它們,你應該開始看看它們。 (我相信你已經使用了其中的一些,但你不知道是否是設計模式。) – dexametason 2012-04-09 08:29:02

+0

@SivaSubramaniam設計模式是一個概念,一個想法。不是真正的下載和運行包。將其視爲軟件開發的最佳實踐,作爲常見軟件開發問題的解決方案。您需要閱讀有關該模式的內容,並考慮如何將其應用於您的用例。 – 2012-04-09 08:46:21

0

我會創建並存儲Runnable對象,以便在某些堆棧結構中進行撤消更改,並根據需要彈出並運行它們。 對於你的例子:

class Board extends JPanel { 
    ArrayList lines = new ArrayList(); 
    Stack<Runnable> undo = new Stack<Runnable>(); 

    public void placeLine() { 
     Point p1, p2; 
     JLabel l1, l2; 


     final Line line = new Line(p1, p2, l1, l2); 
     lines.add(line); 
     undo.push(new Runnable() { 
      @Override 
      public void run() { 
       lines.remove(line); 
       this.repaint(); 
      } 
     }); 

     this.repaint(); 
    } 

    public void deleteLine(final Line l) { 
     lines.remove(l); 
     undo.push(new Runnable() { 
      @Override 
      public void run() { 
       lines.add(l); 
      } 
     }); 
    } 


    public void undo() { 
     undo.pop().run(); 
    } 
}