2D Graphics Java Tutorial

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
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.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PrinterSettingUpDialogPrint extends JFrame {
  DrawingCanvas canvas= new DrawingCanvas();
  JButton setUpButton= new JButton("Page Setup"), printButton= new JButton("Print"), cancelButton= new JButton("Cancel");
  PrinterJob printJob = PrinterJob.getPrinterJob();
  PageFormat pageFormat = printJob.defaultPage();
  PrintableCanvas printableCanvas;
  public PrinterSettingUpDialogPrint() {
    getContentPane().add(canvas);
    JPanel panel = new JPanel();
    panel.setLayout(new GridLayout(1, 3));
    setUpButton.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent a){
        setup();
      }
    });
    panel.add(setUpButton);
    printButton.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent a){
        print();
      }
    });
    panel.add(printButton);
    cancelButton.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent a){
        cancel();
      }
    });
    panel.add(cancelButton);
    getContentPane().add(BorderLayout.SOUTH, panel);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setSize(400, 275);
    setVisible(true);
  }
  private void setup() {
    pageFormat = printJob.pageDialog(pageFormat);
    printJob.validatePage(pageFormat);
  }
  private void print() {
    printableCanvas = new PrintableCanvas(pageFormat);
    printJob.setPrintable(printableCanvas);
    boolean ok = printJob.printDialog();
    if (ok) {
      try {
        printJob.print();
      } catch (Exception pe) {
        System.out.println("Printing Exception Occured!");
        pe.printStackTrace();
      }
    }
  }
  private void cancel() {
    printJob.cancel();
  }
  public static void main(String arg[]) {
    new PrinterSettingUpDialogPrint();
  }
}
class DrawingCanvas extends JPanel {
  Font font = new Font("Dialog", Font.BOLD, 50);
  FontMetrics fontMetrics;
  int w = 400, h = 275;
  DrawingCanvas() {
    setBackground(Color.white);
    setSize(400, 275);
    fontMetrics = getFontMetrics(font);
  }
  public void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2D = (Graphics2D) g;
    paintContent(g2D, w, h);
  }
  public void paintContent(Graphics2D g2D, int w, int h) {
    g2D.setFont(font);
    g2D.drawString("Java 2D", (float) (0.5 * (w - fontMetrics
        .stringWidth("Java 2D"))), (float) (0.5 * h - 1.25 * fontMetrics
        .getHeight()));
  }
}
class PrintableCanvas implements Printable {
  DrawingCanvas canvas;
  PageFormat pageFormat;
  public PrintableCanvas(PageFormat pf) {
    pageFormat = pf;
  }
  public int print(Graphics g, PageFormat pageFormat, int pageIndex)
      throws PrinterException {
    if (pageIndex >= 1) {
      return Printable.NO_SUCH_PAGE;
    }
    Graphics2D g2D = (Graphics2D) g;
    canvas = new DrawingCanvas();
    canvas.paintContent(g2D, (int) pageFormat.getImageableWidth(),
        (int) pageFormat.getImageableHeight());
    return Printable.PAGE_EXISTS;
  }
}