数组列表问题

时间:2014-01-29 21:03:33

标签: java arraylist

我目前正在制作一个绘图程序,并正在实现撤消和重做功能。到目前为止,如果我删除重做部分的代码,它可以工作,但由于某种原因,如果我重新添加重做代码,它只会抛出一个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循环,因为如果你按一次,那么绘画的变化是微小的。

1 个答案:

答案 0 :(得分:1)

在重做循环中,你

  1. 检查是否有可重做项目并重做(如果可以),然后
  2. (无条件地)从重做列表中删除项目
  3. remove()移动到if块中。

    另外,不要使用五个数组。使用名称很好的重做列表创建一个为您完成所有这些操作的类。 (这只是一个提示,与你的问题无关。)