Слушатели мыши в простой программе рисования java

Я пытаюсь написать простую программу рисования на Java, и мне кажется, что я не могу понять различные типы слушателей мыши и то, как они работают.

Я сделал свой прослушиватель нажатий мыши таким образом, чтобы он создавал новый экземпляр строки, к которой добавляются точки при перетаскивании мыши, а затем эта строка добавляется в мой массив строк после отпускания мыши и значения переменная currentLine сбрасывается, чтобы можно было записать новую строку точек.

Это НЕ проблема неправильного понимания исключения нулевого указателя, я знаю, что такое исключение нулевого указателя; Я не понимаю, ПОЧЕМУ я получаю его из-за того, что не понимаю слушателей мыши. Как вы можете видеть, я считаю, что при нажатии мыши создается новый экземпляр линии, поэтому при перетаскивании мыши можно добавлять любые точки.

Если у кого-то есть совет относительно того, где я ошибаюсь, я был бы очень признателен. Большое спасибо

Моя программа состоит из следующих занятий:

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Canvas extends JPanel {

private ArrayList<Line> lines = new ArrayList<Line>();
private Line currentLine;

public Canvas() {

    this.init();
    this.frameInit();

}

private void init() {

    this.setPreferredSize(new Dimension(600,600));

    this.addMouseMotionListener(new MouseAdapter() {

        public void mousePressed(MouseEvent e) {

            currentLine = new Line();

        }

        public void mouseDragged(MouseEvent e) {

            currentLine.points.add(e.getPoint());
            repaint();

        }

        public void mouseReleased(MouseEvent e) {

            if (!currentLine.points.isEmpty()) {
                lines.add(currentLine);
            }

            currentLine=null;

        }

    });

}

private void frameInit() {

    JFrame window = new JFrame("GPaint");
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setContentPane(this);
    window.pack();
    window.setVisible(true);

}

public void paintComponent(Graphics g) {

    Graphics2D twoD = (Graphics2D) g;
    twoD.setColor(Color.RED);
    twoD.setStroke(new BasicStroke(6));

    if (!lines.isEmpty()) {

        for(Line l: lines) {

            if (l.points.size()>1) {

                for(int i=1; i<l.points.size()-1; i++) {

                    twoD.drawLine(l.points.get(i-1).x, l.points.get(i-1).y, l.points.get(i).x, l.points.get(i).y);

                }

            }

            if (l.points.size()==1){

                //0 index as there is only one point, so fill an oval
                twoD.fillOval(l.points.get(0).x-3, l.points.get(0).y-3, 6, 6);

            }

        }

    }

}

}

import java.awt.Point;
import java.util.ArrayList;

public class Line {

ArrayList<Point> points;

public Line() {

    points = new ArrayList<Point>();

}

}

Вот результаты стека:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Canvas$1.mouseDragged(Canvas.java:39)
at java.awt.Component.processMouseMotionEvent(Component.java:6581)
at javax.swing.JComponent.processMouseMotionEvent(JComponent.java:3342)
at java.awt.Component.processEvent(Component.java:6302)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4888)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4542)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4466)
at java.awt.Container.dispatchEventImpl(Container.java:2280)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:90)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.awt.EventQueue$4.run(EventQueue.java:729)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

@ Олег, пожалуйста, посмотрите мой третий абзац в моей последней редакции

user2329174 31.03.2018 01:58

@ Олег, нет, всего, что мне нужно, нет. Когда мышь перетаскивается, каждая точка должна быть добавлена ​​к текущей строке, которая, как я думал, должна была быть создана при нажатии мыши, но явно этого не было, поэтому я хочу понять, почему не был создан новый экземпляр строки

user2329174 31.03.2018 02:07

Я отозвал голосование и ответил на ваш вопрос, извините.

Oleg 31.03.2018 02:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
564
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вам необходимо зарегистрировать MouseListener для приема событий mousePressed и mouseReleased.

Добавление следующего решит вашу проблему.

this.addMouseListener(new MouseAdapter() {

    @Override
    public void mousePressed(MouseEvent e) {
        currentLine = new Line();
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        if (!currentLine.points.isEmpty()) {
            lines.add(currentLine);
        }
        currentLine = null;
    }
});

Другие вопросы по теме