广

MSSQL

  • MYSQL
  • MSSQL
  • Redis
  • MongoDB
  • oracle数据库
  • 数据管理

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

    2018-05-04 21:20:49 次阅读 稿源:互联网
    零七网广告
    全网推广平台,软文发布

    代码如下:

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

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七网广告
    零七网广告
    零七网广告
    零七网广告