Mega Code Archive

 
Categories / Java / 2D Graphics GUI
 

Print Swing components

import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Event; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.font.FontRenderContext; import java.awt.font.LineMetrics; import java.awt.geom.Rectangle2D; import java.awt.print.PageFormat; import java.awt.print.Printable; import java.awt.print.PrinterException; import java.awt.print.PrinterJob; import javax.swing.AbstractAction; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.KeyStroke; public class SwingPrinter extends JFrame {   public static void main(String[] args) {     new SwingPrinter();   }   private PageFormat mPageFormat;   public SwingPrinter() {     super("SwingPrinter v1.0");     createUI();     PrinterJob pj = PrinterJob.getPrinterJob();     mPageFormat = pj.defaultPage();     setVisible(true);   }   protected void createUI() {     setSize(300, 300);     center();     // Add the menu bar.     JMenuBar mb = new JMenuBar();     JMenu file = new JMenu("File", true);     file.add(new FilePrintAction()).setAccelerator(         KeyStroke.getKeyStroke(KeyEvent.VK_P, Event.CTRL_MASK));     file.add(new FilePageSetupAction()).setAccelerator(         KeyStroke.getKeyStroke(KeyEvent.VK_P, Event.CTRL_MASK             | Event.SHIFT_MASK));     file.addSeparator();     file.add(new FileQuitAction()).setAccelerator(         KeyStroke.getKeyStroke(KeyEvent.VK_Q, Event.CTRL_MASK));     mb.add(file);     setJMenuBar(mb);     // Add the contents of the window.     getContentPane().add(new PatchworkComponent());     // Exit the application when the window is closed.     addWindowListener(new WindowAdapter() {       public void windowClosing(WindowEvent e) {         System.exit(0);       }     });   }   protected void center() {     Dimension screen = Toolkit.getDefaultToolkit().getScreenSize();     Dimension us = getSize();     int x = (screen.width - us.width) / 2;     int y = (screen.height - us.height) / 2;     setLocation(x, y);   }   public class FilePrintAction extends AbstractAction {     public FilePrintAction() {       super("Print");     }     public void actionPerformed(ActionEvent ae) {       PrinterJob pj = PrinterJob.getPrinterJob();       ComponentPrintable cp = new ComponentPrintable(getContentPane());       pj.setPrintable(cp, mPageFormat);       if (pj.printDialog()) {         try {           pj.print();         } catch (PrinterException e) {           System.out.println(e);         }       }     }   }   public class FilePageSetupAction extends AbstractAction {     public FilePageSetupAction() {       super("Page setup...");     }     public void actionPerformed(ActionEvent ae) {       PrinterJob pj = PrinterJob.getPrinterJob();       mPageFormat = pj.pageDialog(mPageFormat);     }   }   public class FileQuitAction extends AbstractAction {     public FileQuitAction() {       super("Quit");     }     public void actionPerformed(ActionEvent ae) {       System.exit(0);     }   } } class PatchworkComponent extends JComponent implements Printable {   private float mSide = 36;   private float mOffset = 36;   private int mColumns = 8;   private int mRows = 4;   private String mString = "Java Source and Support";   private Font mFont = new Font("Serif", Font.PLAIN, 64);   private Paint mHorizontalGradient, mVerticalGradient;   public PatchworkComponent() {     float x = mOffset;     float y = mOffset;     float halfSide = mSide / 2;     float x0 = x + halfSide;     float y0 = y;     float x1 = x + halfSide;     float y1 = y + (mRows * mSide);     mVerticalGradient = new GradientPaint(x0, y0, Color.darkGray, x1, y1,         Color.lightGray, true);     x0 = x;     y0 = y + halfSide;     x1 = x + (mColumns * mSide);     y1 = y + halfSide;     mHorizontalGradient = new GradientPaint(x0, y0, Color.darkGray, x1, y1,         Color.lightGray, true);   }   public PatchworkComponent(String s) {     this();     mString = s;   }   public void paintComponent(Graphics g) {     Graphics2D g2 = (Graphics2D) g;     g2.rotate(Math.PI / 24, mOffset, mOffset);     for (int row = 0; row < mRows; row++) {       for (int column = 0; column < mColumns; column++) {         float x = column * mSide + mOffset;         float y = row * mSide + mOffset;         if (((column + row) % 2) == 0)           g2.setPaint(mVerticalGradient);         else           g2.setPaint(mHorizontalGradient);         Rectangle2D r = new Rectangle2D.Float(x, y, mSide, mSide);         g2.fill(r);       }     }     FontRenderContext frc = g2.getFontRenderContext();     float width = (float) mFont.getStringBounds(mString, frc).getWidth();     LineMetrics lm = mFont.getLineMetrics(mString, frc);     float x = ((mColumns * mSide) - width) / 2 + mOffset;     float y = ((mRows * mSide) + lm.getAscent()) / 2 + mOffset;     g2.setFont(mFont);     g2.setPaint(Color.white);     g2.drawString(mString, x, y);   }   public int print(Graphics g, PageFormat pageFormat, int pageIndex) {     if (pageIndex != 0)       return NO_SUCH_PAGE;     paintComponent(g);     return PAGE_EXISTS;   } } class ComponentPrintable implements Printable {   private Component mComponent;   public ComponentPrintable(Component c) {     mComponent = c;   }   public int print(Graphics g, PageFormat pageFormat, int pageIndex) {     if (pageIndex > 0)       return NO_SUCH_PAGE;     Graphics2D g2 = (Graphics2D) g;     g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());     boolean wasBuffered = disableDoubleBuffering(mComponent);     mComponent.paint(g2);     restoreDoubleBuffering(mComponent, wasBuffered);     return PAGE_EXISTS;   }   private boolean disableDoubleBuffering(Component c) {     if (c instanceof JComponent == false)       return false;     JComponent jc = (JComponent) c;     boolean wasBuffered = jc.isDoubleBuffered();     jc.setDoubleBuffered(false);     return wasBuffered;   }   private void restoreDoubleBuffering(Component c, boolean wasBuffered) {     if (c instanceof JComponent)       ((JComponent) c).setDoubleBuffered(wasBuffered);   } }