«Индекс массива вне диапазона: 1» при попытке перекрасить - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь нарисовать линии свободной формы в 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++;
        }
    }
}

1 Ответ

1 голос
/ 08 марта 2019

Кажется, что это происходит во время вызова метода 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 (..). Его легче отладить, так как вы также можете отобразить значение каждой переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...