Как напечатать Swing компоненты



java.awt.print



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(300300);

    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.width2;

    int y = (screen.height - us.height2;

    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 = (Graphics2Dg;



    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 + row2== 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 = (floatmFont.getStringBounds(mString, frc).getWidth();

    LineMetrics lm = mFont.getLineMetrics(mString, frc);

    float x = ((mColumns * mSide- width+ mOffset;

    float y = ((mRows * mSide+ lm.getAscent()) + 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 = (Graphics2Dg;

    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 (instanceof JComponent == false)

      return false;

    JComponent jc = (JComponentc;

    boolean wasBuffered = jc.isDoubleBuffered();

    jc.setDoubleBuffered(false);

    return wasBuffered;

  }



  private void restoreDoubleBuffering(Component c, boolean wasBuffered) {

    if (instanceof JComponent)

      ((JComponentc).setDoubleBuffered(wasBuffered);

  }

}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>