Java打印和打印预览机制实例代码(java代码打印)不要告诉别人

随心笔谈1年前 (2023)发布 admin
119 0

import java.awt.BasicStroke;

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.Component;

import java.awt.Dimension;

import java.awt.Font;

import java.awt.FontMetrics;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.GridLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.print.PageFormat;

import java.awt.print.Printable;

import java.awt.print.PrinterException;

import java.awt.print.PrinterJob;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JScrollPane;

import javax.swing.JTextArea;

import javax.swing.SwingUtilities;

import javax.swing.WindowConstants;

import javax.swing.text.BadLocationException;

import javax.swing.text.Document;

public class PrintUIComponent extends JPanel implements ActionListener,

  Printable {

 private static final long serialVersionUID=4797002827940419724L;

 private static JFrame frame;

 private JTextArea textAreaToPrint;

 private PrinterJob job;

 private int[] pageBreaks;// array of page break line positions

 private String[] textLines;

 private Header header;

 public PrintUIComponent() {

  super(new BorderLayout());

  textAreaToPrint=new JTextArea(50, 20);

  for (int i=1; i <=50; i++) {

   textAreaToPrint.append(“Line ” + i + “\n”);

  }

  JScrollPane scrollPane=new JScrollPane(textAreaToPrint);

  scrollPane.setPreferredSize(new Dimension(250, 200));

  add(scrollPane, BorderLayout.CENTER);

  JButton printButton=new JButton(“Print This TextArea”);

  printButton.setName(“printButton”);

  printButton.addActionListener(this);

  JButton printPreviewButton=new JButton(“Print Preview”);

  printPreviewButton.setName(“printPreviewButton”);

  printPreviewButton.addActionListener(this);

  JPanel buttonGroup=new JPanel(new GridLayout(2, 1));

  buttonGroup.add(printButton);

  buttonGroup.add(printPreviewButton);

  add(buttonGroup, BorderLayout.SOUTH);

  initPrinterJob();

 }

 public static void main(String[] args) {

  SwingUtilities.invokeLater(new Runnable() {

   @Override

   public void run() {

    createAndShowGUI();

   }

  });

 }

 private static void createAndShowGUI() {

  frame=new JFrame(“Print UI Example”);

  frame.setContentPane(new PrintUIComponent());

  frame.pack();

  frame.setLocationRelativeTo(null);

  frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

  frame.setVisible(true);

 }

 private void initTextLines() {

  Document doc=textAreaToPrint.getDocument();

  try {

   String text=doc.getText(0, doc.getLength());

   textLines=text.split(“\n”);

  } catch (BadLocationException e) {

   e.printStackTrace();

  }

 }

 private void initPrinterJob() {

  job=PrinterJob.getPrinterJob();

  job.setJobName(“Print TextArea”);// 出现在系统打印任务列表

  job.setPrintable(this);

 }

 @Override

 public int print(Graphics graphics, PageFormat pageFormat, int pageIndex)

   throws PrinterException {

  Graphics2D g2=(Graphics2D) graphics.create();

  Font font=new Font(“Serif”, Font.PLAIN, 12);

  FontMetrics metrics=g2.getFontMetrics(font);

  int lineHeight=metrics.getHeight();

  if (pageBreaks==null) {

   initTextLines();

   int linesPerPage=(int) (pageFormat.getImageableHeight() / lineHeight);

   int numBreaks=(textLines.length – 1) / linesPerPage;

   pageBreaks=new int[numBreaks];

   for (int b=0; b < numBreaks; b++) {

    pageBreaks[b]=(b + 1) * linesPerPage;

   }

  }

  if (pageIndex > pageBreaks.length) {

   return NO_SUCH_PAGE;

  }

  g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());

  int y=0;

  int start=(pageIndex==0) ? 0 : pageBreaks[pageIndex – 1];

  int end=(pageIndex==pageBreaks.length) ? textLines.length

    : pageBreaks[pageIndex];

  for (int line=start; line < end; line++) {

   y +=lineHeight;

   g2.drawString(textLines[line], 0, y);

  }

  g2.dispose();

  return PAGE_EXISTS;

 }

 @Override

 public void actionPerformed(ActionEvent e) {

  Object actionEventSource=e.getSource();

  if (actionEventSource instanceof JButton) {

   JButton button=(JButton) actionEventSource;

   if (button.getName().equals(“printButton”)) {

    pageBreaks=null;// reset pagination

    boolean ok=job.printDialog();

    if (ok) {

     try {

      job.print();

     } catch (PrinterException ex) {

      ex.printStackTrace();

     }

    }

   } else if (button.getName().equals(“printPreviewButton”)) {

    pageBreaks=null;// reset pagination

    createAndShowPreviewDialog();

   }

  }

 }

 private void createAndShowPreviewDialog() {

  JDialog previewDialog=new JDialog(frame, “Print Preview Dialog”, true);

  JPanel contentPane=new JPanel(new BorderLayout());

  PreviewArea previewArea=new PreviewArea();

  previewArea.addMouseListener(new PreviewAreaMouseAdapter(previewArea));

  JScrollPane scrollPane=new JScrollPane(previewArea);

  contentPane.add(scrollPane, BorderLayout.CENTER);

  header=new Header(previewArea);

  contentPane.add(header, BorderLayout.NORTH);

  previewDialog.setContentPane(contentPane);

  previewDialog.setSize(600, 600);

  previewDialog

    .setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);

  previewDialog.setVisible(true);

 }

 private class Header extends Component {

  private static final long serialVersionUID=-1741188309769027249L;

  private PreviewArea previewArea;

  private boolean paintable;

  private Header(PreviewArea previewArea) {

   this.previewArea=previewArea;

  }

  private void setPaintable(boolean paintable) {

   this.paintable=paintable;

  }

  @Override

  public void paint(Graphics g) {

   if (paintable) {

    g.setColor(Color.GRAY);

    g.drawString(

      String.valueOf(previewArea.getPageIndex() + 1)

        + “/”

        + String.valueOf(pageBreaks.length + 1)

        + ” pages (Click left mouse button to preview next page; right to previous)”,

      10, 15);

   }

  }

  @Override

  public Dimension getPreferredSize() {

   return new Dimension(super.getPreferredSize().width, 20);

  }

 }

 private class PreviewArea extends Component {

  private static final long serialVersionUID=-6384174997251439843L;

  private PageFormat pageFormat;

  private int pageIndex;

  private int w;

  private int h;

  private final int marginX=10;

  private final int marginY=20;

  private PreviewArea() {

   pageFormat=job.pageDialog(job.defaultPage());

   pageIndex=0;

   w=(int) pageFormat.getWidth();

   h=(int) pageFormat.getHeight();

  }

  private int getPageIndex() {

   return pageIndex;

  }

  private void setPageIndex(int pageIndex) {

   this.pageIndex=pageIndex;

  }

  @Override

  public Dimension getPreferredSize() {

   return new Dimension(w + 2 * marginX, h + 2 * marginY);

  }

  @Override

  public void paint(Graphics g) {

   Graphics2D g2=(Graphics2D) g.create();

   g2.translate(marginX, marginY);

   g2.drawRect(0, 0, w, h);

   int ix=(int) (pageFormat.getImageableX() – 1);

   int iy=(int) (pageFormat.getImageableY() – 1);

   int iw=(int) (pageFormat.getImageableWidth() + 1);

   int ih=(int) (pageFormat.getImageableHeight() + 1);

   g2.setStroke(new BasicStroke(1f, BasicStroke.CAP_ROUND,

     BasicStroke.JOIN_ROUND, 10f, new float[] { 5, 5 }, 0f));

   g2.drawRect(ix, iy, iw, ih);

   try {

    PrintUIComponent.this.print(g2, pageFormat, pageIndex);

   } catch (PrinterException e) {

    e.printStackTrace();

   }

   g2.dispose();

   header.setPaintable(true);

   header.repaint();

  }

 }

 private class PreviewAreaMouseAdapter extends MouseAdapter {

  private PreviewArea previewArea;

  private PreviewAreaMouseAdapter(PreviewArea previewArea) {

   this.previewArea=previewArea;

  }

  @Override

  public void mouseClicked(MouseEvent e) {

   int currentIndex=previewArea.getPageIndex();

   if (e.getButton()==MouseEvent.BUTTON1) {

    if (currentIndex < pageBreaks.length) {

     previewArea.setPageIndex(currentIndex + 1);

     previewArea.repaint();

    }

   } else if (e.getButton()==MouseEvent.BUTTON3) {

    if (currentIndex > 0) {

     previewArea.setPageIndex(currentIndex – 1);

     previewArea.repaint();

    }

   }

  }

 }

}

© 版权声明

相关文章