网站首页  汉语字词  英语词汇  考试资料  写作素材  旧版资料

请输入您要查询的考试资料:

 

标题 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.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();
    }
    }
    }
    }
    }
随便看

 

在线学习网考试资料包含高考、自考、专升本考试、人事考试、公务员考试、大学生村官考试、特岗教师招聘考试、事业单位招聘考试、企业人才招聘、银行招聘、教师招聘、农村信用社招聘、各类资格证书考试等各类考试资料。

 

Copyright © 2002-2024 cuapp.net All Rights Reserved
更新时间:2025/5/21 18:36:05