我目前正在制作一个绘图程序,并正在实现撤消和重做功能。到目前为止,如果我删除重做部分的代码,它可以工作,但由于某种原因,如果我重新添加重做代码,它只会抛出一个arrayOutOfIndex异常或NullPointer。我已经尝试了一切,不知道还有什么可做的!
对不起,如果这个问题非常简单;我只是个初学者。
代码:
public void redo()
{
for(int i = 0; i < 3; i++ ){
if(redo[0].get(0)!=null){
al.add((Shape) redo[0].get(redo[0].size()-1));
cl.add((Color) redo[1].get(redo[1].size()-1));
tl.add((Integer) redo[2].get(redo[2].size()-1));
lineEnd.add((Integer) redo[3].get(redo[3].size()-1));
junction.add((Component) redo[4].get(redo[4].size()-1));
}
redo[0].remove(redo[0].size()-1);
redo[1].remove(redo[1].size()-1);
redo[2].remove(redo[2].size()-1);
redo[3].remove(redo[3].size()-1);
redo[4].remove(redo[4].size()-1);
}
repaint();
}
public void undo()
{
for(int i = 0; i < 3; i++ ){
Shape alComponent = al.get(al.size()-1);
Color clComponent = cl.get(cl.size()-1);
Integer tlComponent = tl.get(tl.size()-1);
Integer lineEndComponent = lineEnd.get(lineEnd.size()-1);
Integer junctionComponent = juncture.get(juncture.size()-1);
if(al.get(0)!=null){
redo[0].add(alComponent);
redo[1].add(clComponent);
redo[2].add(tlComponent);
redo[3].add(lineEndComponent);
redo[4].add(junctionComponent);
}
al.remove(al.size()-1);
cl.remove(cl.size()-1);
tl.remove(tl.size()-1);
lineEnd.remove(lineEnd.size()-1);
juncture.remove(juncture.size()-1);
}
repaint();
}
P.S。,我有一个for循环,因为如果你按一次,那么绘画的变化是微小的。
答案 0 :(得分:1)
在重做循环中,你
将remove()
移动到if块中。
另外,不要使用五个数组。使用名称很好的重做列表创建一个为您完成所有这些操作的类。 (这只是一个提示,与你的问题无关。)