

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class Scribble {
   
   public static void main(String[] args) {
      JFrame w = new JFrame("Scribble");
      w.setSize(500, 500);
      w.add(new Scribbler());
      w.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      w.setVisible(true);
   }

   public static class Scribbler extends JComponent {

      List<List<Point>> segments = new ArrayList<List<Point>>();

      Scribbler() {
         segments.add(new ArrayList<Point>());
         
         addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent me) {
               addNextPoint(me);
            }

            public void mouseReleased(MouseEvent me) {
               segments.add(new ArrayList<Point>());
               repaint();
            }
         });
         
         addMouseMotionListener(new MouseMotionAdapter() {
            public void mouseDragged(MouseEvent me) {
               addNextPoint(me);
            }
         });
      }
      
      void addNextPoint(MouseEvent me) {
         segments.get(segments.size() - 1).add(me.getPoint());
         repaint();
      }

      public void paint(Graphics g) {
         g.setColor(Color.WHITE);
         Rectangle b = g.getClip().getBounds();
         g.fillRect(b.x, b.y, b.width, b.height);
         g.setColor(Color.BLUE);
         for (List<Point> segment : segments) {
            if (segment.isEmpty()) continue;
            Point last = null;
            for (Point p : segment) {
               if (last != null) g.drawLine(last.x, last.y, p.x, p.y);                  
               last = p;
            }
         }
      }
   }
}
