Mega Code Archive

 
Categories / Java / 2D Graphics GUI
 

Book

import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Paint; import java.awt.font.FontRenderContext; import java.awt.font.LineMetrics; import java.awt.geom.Rectangle2D; 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 javax.swing.JComponent; public class Booker {   public static void main(String[] args) {     PrinterJob pj = PrinterJob.getPrinterJob();     // Create two Printables.     Component c1 = new PatchworkComponent("Printable 1");     Component c2 = new PatchworkComponent("Printable 2");     c1.setSize(500, 400);     c2.setSize(500, 400);     BookComponentPrintable printable1 = new BookComponentPrintable(c1);     BookComponentPrintable printable2 = new BookComponentPrintable(c2);     // Create two PageFormats.     PageFormat pageFormat1 = pj.defaultPage();     PageFormat pageFormat2 = (PageFormat) pageFormat1.clone();     pageFormat2.setOrientation(PageFormat.LANDSCAPE);     // Create a Book.     Book book = new Book();     book.append(printable1, pageFormat1);     book.append(printable2, pageFormat2);     // Print the Book.     pj.setPageable(book);     if (pj.printDialog()) {       try {         pj.print();       } catch (PrinterException e) {         System.out.println(e);       }     }   } } 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 BookComponentPrintable implements Printable {   private Component mComponent;   public BookComponentPrintable(Component c) {     mComponent = c;   }   public int print(Graphics g, PageFormat pageFormat, int pageIndex) {     Graphics2D g2 = (Graphics2D) g;     g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());     mComponent.paint(g2);     return PAGE_EXISTS;   } }