我正在尝试在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++;
}
}
}
答案 0 :(得分:1)
似乎在调用repaint()方法期间发生了
iterationDeLigne++;
一种绘画方法仅用于绘画。您不应该在绘画方法中更改类的属性,因为您无法控制Swing将在何时或多久重新绘画一次组件。
我真的不知道您要做什么,但总的来说paintComponent()方法应该:
此外,在问这样的问题之前,请进行一些基本的调试,并告诉我们引起问题的确切说明。异常跟踪将告诉您引起问题的语句的行号。
帮助您进行调试,而不要使用类似以下的代码:
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(..)方法时,您将知道问题是否出在。调试起来也很容易,因为您也可以显示每个变量的值。