java - 尝试重绘时“数组索引超出范围: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++;
}
}
}
解决方案
似乎在调用 repaint() 方法期间发生了
iterationDeLigne++;
绘画方法仅用于绘画。您不应该在绘画方法中更改类的属性,因为您无法控制 Swing 何时或多久重新绘制组件。
我真的不知道您要做什么,但通常 paintComponent() 方法应该:
- 调用 super.paintComponent(...) 作为清除背景的第一条语句
- 遍历您的 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(..) 方法时。调试起来更容易,因为您也可以显示每个变量的值。
推荐阅读
- python-3.x - Python生成器只返回yield的第一个实例
- javascript - 我可以使用解构来创建深层副本吗?
- android - 在 x86_64 上使用 x86_64 NDK 工具链链接失败
- laravel - 在 Laravel 中合并两个集合并访问它
- c# - C# xUnit 测试错误 - 以下构造函数参数没有匹配的夹具数据
- gulp - 如何修复“多次调用写回调”
- c# - 在 monogame 的屏幕上使用鼠标单击将值分配给 2D 数组
- r - R:按最近的日期时间合并数据框
- php - file_exists($img) 和 @getimagesize($img) 总是返回 false
- named-ranges - 如何使用其命名范围引用列号?