尝试重新绘制时,“数组索引超出范围:1”

时间:2019-03-07 21:03:47

标签: java swing user-interface

我正在尝试在Java中绘制自由形式的线条,但是我得到的数组索引超出范围:1错误,我不知道为什么。好像是在调用repaint()方法期间发生的。我的向量做错了吗?我添加Point对象的方式?(好像我可能没有在向量中添加任何东西?)。

private int iterationDeLigne = 0;

private Vector<Point> locationDepart = new Vector<Point>();
private Vector<Point> locationArrivee = new Vector<Point>();

private class EcouteurDessin implements MouseListener
{

    @Override
    public void mouseClicked(MouseEvent e) {}
    @Override
    public void mouseEntered(MouseEvent e) {}
    @Override
    public void mouseExited(MouseEvent e) {}

    @Override
    public void mousePressed(MouseEvent e) {
        MouseIsPressed = true;
        locationDepart.add(e.getPoint());
    }

    @Override
    public void mouseReleased(MouseEvent e) {}
}

private class EcouteurMouvement implements MouseMotionListener
{

    @Override
    public void mouseDragged(MouseEvent e) {
        locationArrivee.add(e.getPoint());
        repaint();
    }
    @Override
    public void mouseMoved(MouseEvent e) {} 
}

private class Panel_Graphique extends JPanel
{
    @Override
    protected void paintComponent(Graphics g)
    {
        //switch()
        g.setColor(Color.BLACK);
        if(MouseIsPressed == true)
        {
            g.drawLine((int)locationDepart.get(iterationDeLigne).getX(), (int)locationDepart.get(iterationDeLigne).getY(),
                    (int)locationArrivee.get(iterationDeLigne).getX(), (int)locationArrivee.get(iterationDeLigne).getY());
            iterationDeLigne++;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  

似乎在调用repaint()方法期间发生了

iterationDeLigne++;

一种绘画方法仅用于绘画。您不应该在绘画方法中更改类的属性,因为您无法控制Swing将在何时或多久重新绘画一次组件。

我真的不知道您要做什么,但总的来说paintComponent()方法应该:

  1. 调用super.paintComponent(...)作为清除背景的第一条语句
  2. 遍历ArrayList以重新绘制列表中的所有点。

此外,在问这样的问题之前,请进行一些基本的调试,并告诉我们引起问题的确切说明。异常跟踪将告诉您引起问题的语句的行号。

帮助您进行调试,而不要使用类似以下的代码:

g.drawLine((int)locationDepart.get(iterationDeLigne).getX(), (int)locationDepart.get(iterationDeLigne).getY(), (int)locationArrivee.get(iterationDeLigne).getX(), (int)locationArrivee.get(iterationDeLigne).getY());

上面的代码不仅不能单行显示,而且您也无法判断问题出在哪里。

因此将代码简化为:

Point depart = locationDepart.get( iterationDeLigne );
Point arrivee = locationArrivee.get( iterationDeLigne );
g.drawLine(depart.x, depart.y, arrive.x, arrive,y);

现在,当您访问ArrayLists或drawLine(..)方法时,您将知道问题是否出在。调试起来也很容易,因为您也可以显示每个变量的值。