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