• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 浪子 | 发布时间: 2025-6-18 12:31| 查看数: 117| 评论数: 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;
    /**
    * 使用了原始的分页方式去渲染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("rint This TextArea");
      printButton.setName("printButton");
      printButton.addActionListener(this);
      JButton printPreviewButton = new JButton("rint 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("rint 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("rint 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 + 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, "rint 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();
        }
       }
      }
    }
    }


    来源:https://www.jb51.net/article/46188.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表