Рисование зигзагов в Java

У меня есть дизайн-проект, и я должен рисовать зигзаги на Java с помощью мыши. Прежде всего, я использую MouseListener и в методе mouseClicked я собираю все точки, которые нажимает пользователь:

 public void mouseClicked(MouseEvent e){
    if(isAbleToDraw){
    corners[points]=e.getPoint();
        points++;
        repaint();
    }
 }

Здесь я использую логическое значение «isAbleToDraw», чтобы проверить, нажал ли пользователь кнопки «рисовать» или «остановить рисование». Затем я рисую зигзаги следующим образом:

 super.paintComponent(graph);
 Graphics2D g = (Graphics2D) graph;
 g.drawLine(corners[i].x, corners[i].y, corners[i+1].x, corners[i+1].y);

Наконец, проблема в том, что когда я нажимал кнопку «Остановить рисование» после рисования зигзага, а затем после повторного нажатия кнопки «Нарисовать», он продолжает рисовать линии из последней точки, которую оставил. Другими словами, я не могу нарисовать 2 разных зигзага.

Любая идея о том, как решить проблему?


person josh    schedule 07.10.2011    source источник


Ответы (2)


Если вы хотите, чтобы пользователь мог рисовать более одного зигзага и видеть их оба на экране, вы можете использовать Collection массивов точек. Каждый раз, когда пользователь нажимает кнопку "рисовать", вы добавляете новый массив в коллекцию и делаете этот новый массив активным массивом. В вашем mouseClicked вы можете добавить точки, которые пользователь щелкает, в активный массив точек, и когда вы рисуете компонент, а не просто рисуете один зигзаг, перебираете набор массивов и рисуете их все.

person ninesided    schedule 07.10.2011
comment
Хорошо, я создал ArrayList и выполнил шаги, которые вы написали, и это сработало. Но когда я нажимаю кнопку рисования, предыдущий рисунок теряется на экране. Вот как я это делаю: if(e.getSource() == draw){ Point[] newZigzag = new Point[200]; (drawing.getMyArrayList()).добавить(newZigzag); Drawing.setActiveArray (новый зигзаг); рисунок.setAbleToDraw (истина); } - person josh; 07.10.2011
comment
что ты делаешь в repaint? - person ninesided; 08.10.2011
comment
Ну, я разобрался, и теперь все работает нормально. Спасибо за помощь. - person josh; 08.10.2011

Пахнет домашней работой.

Вы не очищаете массив, когда пользователь перестает рисовать. Когда они нажимают на первую точку новой фигуры, последняя точка старой фигуры все еще находится в конце массива, поэтому ваша функция рисования точно рисует линию между ними. Если вы очистите массив, когда они перестанут рисовать, он должен вести себя так, как вы хотите.

person Sam Hanes    schedule 07.10.2011
comment
Это большой проект, это только малая его часть :) Что ж, вы правы. Я не очищаю массив, но когда я это делаю, он больше не рисует линии и выдает исключение нулевого указателя, верно? - person josh; 07.10.2011
comment
NPE можно избежать, проверив, пуст ли массив, прежде чем разыменовывать его. Исчезнут ли другие линии, зависит от того, является ли ваш рисунок кумулятивным или гашением. Ответ @nineside - лучшее (хотя и более сложное) решение. - person Sam Hanes; 07.10.2011