2012-04-09 153 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(); 
    } 
}