«Индекс массива вне диапазона: 1» при попытке перерисовки

#java #swing #user-interface

#java #swing #пользовательский интерфейс

Вопрос:

Я пытаюсь нарисовать линии произвольной формы на java, но я получаю ошибку индекса массива вне диапазона: 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  ;
        }
    }
}
  

Комментарии:

1. Никогда не сравнивайте логическое значение с true или false. Просто скажите if( MouseIsPressed) или if( !MouseIsPressed) , что предполагается, что MouseIsPressed является логической переменной (вы не показываете ее определение). В любом случае, в качестве имени переменной оно должно начинаться со строчной буквы.

Ответ №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 (..). Это проще в отладке, поскольку вы также можете отображать значение каждой переменной.

Комментарии:

1. @FredK, пожалуйста, удалите свой комментарий, поскольку он не имеет никакого отношения к моему ответу. Если вы хотите сообщить OP, как работают индексы Java, добавьте это в качестве комментария к вопросу. Как я предположил в своем ответе, проблема заключается в том, что переменная «iterationDeLigne» увеличивается в методе paintComponent (), что в конечном итоге вызовет это исключение, поскольку вы не можете контролировать, как часто вызывается метод.