import java.awt.*; import javax.swing.*; import java.awt.print.*; /** A simple utility class that lets you very simply print * an arbitrary component. Just pass the component to the * PrintUtilities.printComponent. The component you want to * print doesn't need a print method and doesn't have to * implement any interface or do anything special at all. * * If you are going to be printing many times, it is marginally more * efficient to first do the following: * * PrintUtilities printHelper = new PrintUtilities(theComponent); * * then later do printHelper.print(). But this is a very tiny * difference, so in most cases just do the simpler * PrintUtilities.printComponent(componentToBePrinted). * * 7/99 Marty Hall, http://www.apl.jhu.edu/~hall/java/ * May be freely used or adapted. */ public class PrintUtilities implements Printable { /** le composant à imprimer */ private Component componentToBePrinted; /** imprimer composant * @param c le composant */ public static void printComponent(Component c) { new PrintUtilities(c).print(); } /** constructeur * @param componentToBePrinted compsant à imprimer */ public PrintUtilities(Component componentToBePrinted) { this.componentToBePrinted = componentToBePrinted; } /** print method **/ public void print() { PrinterJob printJob = PrinterJob.getPrinterJob(); printJob.setPrintable(this); if (printJob.printDialog()) try { printJob.print(); } catch(PrinterException pe) { System.out.println("Error printing: " + pe); } } /** print method * @param g graphisme * @param pageFormat format * @param pageIndex index * @return valeur de retour de l'impression */ public int print(Graphics g, PageFormat pageFormat, int pageIndex) { if (pageIndex > 0) { return(NO_SUCH_PAGE); } else { Graphics2D g2d = (Graphics2D)g; g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY()); disableDoubleBuffering(componentToBePrinted); componentToBePrinted.paint(g2d); enableDoubleBuffering(componentToBePrinted); return(PAGE_EXISTS); } } /** The speed and quality of printing suffers dramatically if * any of the containers have double buffering turned on. * So this turns if off globally. * @see enableDoubleBuffering * @param c composant */ public static void disableDoubleBuffering(Component c) { RepaintManager currentManager = RepaintManager.currentManager(c); currentManager.setDoubleBufferingEnabled(false); } /** Re-enables double buffering globally. * @param c composant */ public static void enableDoubleBuffering(Component c) { RepaintManager currentManager = RepaintManager.currentManager(c); currentManager.setDoubleBufferingEnabled(true); } }