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

2023-12-01 0 981

复制代码 代码如下: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 positionsprivate 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() {@Overridepublic 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);}


@Overridepublic 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;}


@Overridepublic void actionPerformed(ActionEvent e) {Object actionEventSource = e.getSource();if (actionEventSource instanceof JButton) {JButton button = (JButton) actionEventSource;if (button.getName().equals(\”printButton\”)) {pageBreaks = null;// reset paginationboolean 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 paginationcreateAndShowPreviewDialog();}}}


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


@Overridepublic 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);}}


@Overridepublic 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;}


@Overridepublic Dimension getPreferredSize() {return new Dimension(w + 2 * marginX, h + 2 * marginY);}


@Overridepublic 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;}


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

您可能感兴趣的文章:

  • JavaWeb实现打印功能
  • java控制Pdf自动打印的小例子
  • 分享java打印简单图形的实现代码
  • java打印当前方法名示例分享
  • java打印正弦曲线示例
  • Java编程打印购物小票实现代码
  • Java如何调用TSC打印机进行打印详解

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悠久资源 MsSql Java打印和打印预览机制实例代码 https://www.u-9.cn/database/mssql/6146.html

常见问题

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务