Java Swing dibuja líneas haciendo clic y arrastrando el mouse

Quiero traer de vuelta una pregunta que se hizo antes:java dibujar línea mientras se mueve el mouse

"Me gustaría agregar una función a mi aplicación que permita al usuario dibujar una línea recta haciendo clic con el mouse en la ubicación inicial y soltándola en la ubicación final. La línea debe moverse a medida que el mouse se mueve hasta que finalmente se suelta; similar a la forma en que se puede dibujar una línea con la aplicación Microsoft Paint.

¿Cómo puede implementar esto para que la línea se vuelva a pintar a medida que se mueve sin volver a pintar otras cosas que ya se pueden dibujar en esa área rectangular?

La pregunta es: ¿Cómo puedo dibujar varias líneas con las líneas viejas todavía allí?

Este es el código que funciona para mí, pero la línea anterior se borra tan pronto como dibuja uno nuevo:

public static void main(String args[]) throws Exception {
    JFrame f = new JFrame("Draw a Red Line");
    f.setSize(300, 300);
    f.setLocation(300, 300);
    f.setResizable(false);
    JPanel p = new JPanel() {
        Point pointStart = null;
        Point pointEnd   = null;
        {
            addMouseListener(new MouseAdapter() {
                public void mousePressed(MouseEvent e) {
                    pointStart = e.getPoint();
                }

                public void mouseReleased(MouseEvent e) {
                    pointStart = null;
                }
            });
            addMouseMotionListener(new MouseMotionAdapter() {
                public void mouseMoved(MouseEvent e) {
                    pointEnd = e.getPoint();
                }

                public void mouseDragged(MouseEvent e) {
                    pointEnd = e.getPoint();
                    repaint();
                }
            });
        }
        public void paint(Graphics g) {
            super.paint(g);
            if (pointStart != null) {
                g.setColor(Color.RED);
                g.drawLine(pointStart.x, pointStart.y, pointEnd.x, pointEnd.y);
            }
        }
    };
    f.add(p);
    f.setVisible(true); 
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta