首页 > 解决方案 > 尝试重绘时“数组索引超出范围:1”

问题描述

我正在尝试在 java 中绘制自由格式线,但我得到一个 Array index out of range: 1 错误,我不知道为什么。似乎它是在调用 repaint() 方法期间发生的。我的向量做错了吗?我添加我的点对象的方式?(似乎我可能没有向我的向量添加任何东西?)。

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++;
        }
    }
}

标签: javaswinguser-interface

解决方案


似乎在调用 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(..) 方法时。调试起来更容易,因为您也可以显示每个变量的值。


推荐阅读