加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 06:41:46 所属栏目:Java 来源:网络整理
导读:代码如下: 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.

代码如下:
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,提供了打印预览机制。
*


* 事实上,我们还可以通过其他方式打印JTextArea:
*


    *
  1. {@code Component.print(Graphics g);} or
    * {@code Component.printAll(Graphics g);}

  2. *
  3. {@code Component.paint(Graphics g);} or
    * {@code Component.paintAll(Graphics g);} whose rending may be slightly
    * different to the previous method (for example,JFrame)

  4. *
  5. {@code JTable.print();} or {@code JTextComponent.print();} provide
    * especially powerful and convenient printing mechanism

  6. *

*
* @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],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,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();
}
}
}
}
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读