我有一个名为' lines'的行对象的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几乎是不可能的。
答案 0 :(得分:0)
我建议您阅读Memento模式(http://en.wikipedia.org/wiki/Memento_pattern),然后在网上搜索使用此模式的一些代码示例。
答案 1 :(得分: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();
}
}