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,每次我撤消时,撤消方法都必须恢复到最后一个操作(即创建一行或删除一行)。我已经尝试撤消 JTextArea 中的事件,但我不知道如何为 ArrayLists 中的事件更改构建自定义撤消。建议一个这样做的例子。

我真的很抱歉没有将它作为 SSCCE 发布。这是一个巨大的项目,几乎不可能创建 SSCCE。

4

2 回答 2

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();
    }
}
于 2012-04-09T09:15:25.777 回答
0

我建议您阅读有关 Memento 模式 ( http://en.wikipedia.org/wiki/Memento_pattern ) 的信息,然后在网上搜索一些使用此模式的代码示例。

于 2012-04-09T08:21:57.927 回答