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); } }