源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java打印和打印预览机制实例代码

  • 时间:2020-02-11 18:41 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java打印和打印预览机制实例代码
[u]复制代码[/u] 代码如下:
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; /**  * 使用了原始的分页方式去渲染JTextArea,提供了打印预览机制。  * <p>  * 事实上,我们还可以通过其他方式打印JTextArea:  * <ol>  * <li>{@code Component.print(Graphics g);} or  * {@code Component.printAll(Graphics g);}</li>  * <li>{@code Component.paint(Graphics g);} or  * {@code Component.paintAll(Graphics g);} whose rending may be slightly  * different to the previous method (for example, <code>JFrame</code>)</li>  * <li>{@code JTable.print();} or {@code JTextComponent.print();} provide  * especially powerful and convenient printing mechanism</li>  * </ol>  *  * @author Gaowen  */ 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);   /* Initialize PrinterJob */   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 {   /*    * It is safe to use a copy of this graphics as this will not involve    * changes to it.    */   Graphics2D g2 = (Graphics2D) graphics.create();   /* Calculate "pageBreaks" */   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;    }   }   /* Condition to exit printing */   if (pageIndex > pageBreaks.length) {    return NO_SUCH_PAGE;   }   /* (0,0) is outside the imageable area, translate to avoid clipping */   g2.translate(pageFormat.getImageableX(), pageFormat.getImageableY());   /* Draw each line that is on this page */   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);   }   /* dispose of the graphics copy */   g2.dispose();   /* Tell the caller that this page is part of the printed document */   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) {       /* The job did not successfully complete */       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) {     /* next page */     if (currentIndex < pageBreaks.length) {      previewArea.setPageIndex(currentIndex + 1);      previewArea.repaint();     }    } else if (e.getButton() == MouseEvent.BUTTON3) {     /* previous page */     if (currentIndex > 0) {      previewArea.setPageIndex(currentIndex - 1);      previewArea.repaint();     }    }   }  } }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部