2D Graphics GUI Java

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.print.Book;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.util.Vector;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.TitledBorder;
public class BookDemo extends JFrame {
  DrawingCanvas canvas;
  JRadioButton portraitButton = new JRadioButton("Portrait", true);
  JRadioButton landscapeButton = new JRadioButton("Landscape");
  JRadioButton rLandscapeButton = new JRadioButton("Reverse Landscape");
  JButton addButton = new JButton("Add to Book");
  JButton printButton = new JButton("Print");
  JButton clearButton = new JButton("Clear");
  public BookDemo() {
    super();
    Container container = getContentPane();
    canvas = new DrawingCanvas();
    container.add(canvas);
    JPanel panel = new JPanel(new GridLayout(2, 6));
    container.add(panel, BorderLayout.SOUTH);
    ButtonGroup gp = new ButtonGroup();
    gp.add(portraitButton);
    gp.add(landscapeButton);
    gp.add(rLandscapeButton);
    ActionListener buttonListener = new ButtonListener();
    portraitButton.addActionListener(buttonListener);
    landscapeButton.addActionListener(buttonListener);
    rLandscapeButton.addActionListener(buttonListener);
    panel.add(portraitButton);
    panel.add(landscapeButton);
    panel.add(rLandscapeButton);
    addButton.addActionListener(buttonListener);
    printButton.addActionListener(buttonListener);
    clearButton.addActionListener(buttonListener);
    panel.add(addButton);
    panel.add(printButton);
    panel.add(clearButton);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent e) {
        System.exit(0);
      }
    });
    setSize(450, 425);
    setVisible(true);
  }
  public static void main(String arg[]) {
    new BookDemo();
  }
  class ButtonListener implements ActionListener {
    PrinterJob jobControl;
    PageFormat pageFormat;
    Book book;
    ButtonListener() {
      jobControl = PrinterJob.getPrinterJob();
      pageFormat = jobControl.defaultPage();
      book = new Book();
    }
    public void actionPerformed(ActionEvent e) {
      Object obj = e.getSource();
      if (obj instanceof JRadioButton) {
        JRadioButton tempButton = (JRadioButton) obj;
        if (tempButton.equals(portraitButton)) {
          pageFormat.setOrientation(PageFormat.PORTRAIT);
        }
        else if (tempButton.equals(landscapeButton)) {
          pageFormat.setOrientation(PageFormat.LANDSCAPE);
        } else if (tempButton.equals(rLandscapeButton)) {
          pageFormat.setOrientation(PageFormat.REVERSE_LANDSCAPE);
        }
      } else if (obj instanceof JButton) {
        JButton tempButton = (JButton) obj;
        if (tempButton.equals(addButton)) {
          book.append(new PrintableCanvas(canvas.getShapesVector()),
              (PageFormat) pageFormat.clone());
        } else if (tempButton.equals(printButton)) {
          jobControl.setPageable(book);
          if (jobControl.printDialog()) {
            try {
              jobControl.print();
            } catch (Exception pe) {
              System.out.println("Printing Exception Occured!");
              pe.printStackTrace();
            }
          }
        } else if (tempButton.equals(clearButton)) {
          canvas.shapesVector.clear();
          canvas.clear = true;
          canvas.repaint();
        }
      }
    }
  }
  class DrawingCanvas extends Canvas {
    private Vector shapesVector;
    Point2D currPoint, newPoint;
    Line2D line;
    boolean clear = false;
    DrawingCanvas() {
      shapesVector = new Vector();
      addMouseListener(new MouseHandler());
      addMouseMotionListener(new MouseMotionHandler());
      setBackground(Color.white);
      setSize(450, 400); 
    }
    public Vector getShapesVector() {
      return shapesVector;
    }
    public void update(Graphics g) {
      Graphics2D g2D = (Graphics2D) g;
      g2D.setColor(Color.black);
      if (currPoint != null && newPoint != null) {
        line = new Line2D.Float(currPoint, newPoint);
        g2D.draw(line);
        shapesVector.addElement(line);
      }
      currPoint = newPoint; 
      if (clear) {
        g2D.setColor(Color.white);
        g2D.fillRect(0, 0, getWidth(), getHeight());
        clear = false;
      }
    }
    public void paint(Graphics g) {
      Graphics2D g2D = (Graphics2D) g;
      g2D.setColor(Color.black);
      for (int i = 0; i < shapesVector.size(); i++) {
        Line2D.Float line2D = (Line2D.Float) shapesVector.elementAt(i);
        g2D.draw(line2D);
      }
    }
    class MouseHandler extends MouseAdapter {
      public void mousePressed(MouseEvent e) {
        currPoint = newPoint = e.getPoint();
        repaint();
      }
    }
    class MouseMotionHandler extends MouseMotionAdapter {
      public void mouseDragged(MouseEvent e) {
        newPoint = e.getPoint();
        repaint();
      }
    }
  }
  class PrintableCanvas implements Printable {
    private Vector linesVector;
    public PrintableCanvas(Vector vector) {
      linesVector = (Vector) vector.clone();
    }
    public int print(Graphics pg, PageFormat pf, int pi)
        throws PrinterException {
      Graphics2D pg2D = (Graphics2D) pg;
      pg2D.translate(pf.getImageableX(), pf.getImageableY());
      pg2D.setPaint(Color.green);
      pg2D.drawString(" ", 100, 100);
      pg2D.setPaint(Color.black);
      for (int i = 0; i < linesVector.size(); i++) {
        Line2D.Float line2D = (Line2D.Float) linesVector.elementAt(i);
        pg2D.draw(line2D);
      }
      return Printable.PAGE_EXISTS;
    }
  }
}