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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试重绘时“数组索引超出范围:1”相关的知识,希望对你有一定的参考价值。

我正在尝试在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++;
        
    

答案

似乎在调用repaint()方法期间发生了这种情况

iterationDeLigne++;

绘画方法仅用于绘画。您不应该在绘制方法中更改类的属性,因为您无法控制Swing重绘组件的时间或频率。

我真的不知道你想要做什么,但一般来说paintComponent()方法应该:

  1. 调用super.paintComponent(...)作为清除背景的第一个语句
  2. 迭代您的ArrayList以重新绘制列表中的所有Points。

此外,在问这样的问题之前,先做一些基本的调试,并告诉我们导致问题的确切陈述。异常跟踪将告诉您导致问题的语句的行号。

帮助您调试,而不是使用如下代码:

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(..)方法时,您将知道问题是否存在。它更容易调试,因为您也可以显示每个变量的值。

以上是关于尝试重绘时“数组索引超出范围:1”的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:ObservableObject 在重绘时不会保持其状态

TabView 在重绘时是不是会错过导航点击?

在 MFC 中重绘时闪烁

Today Extension 视图在重绘时闪烁

自定义视图在缩放后重绘时如何防止“反弹”效果?

.Net CF 防止过度、不耐烦的点击(屏幕重绘时)