Java的打印功能
DeveloperWork上分享的一篇讲解Java打印技术的文章 和 Oracle上的关于Printing的Guide : 主要用到两个包 java.awt.print and javax.print
The basic printing operations are represented in the following sections:
A Basic Printing Program – this section describes the Printable interface and presents a basic printing program.
Using Print Setup Dialogs– this sections explains how to display the Print Setup Dialog.
Printing a Multiple Page Document – this section explains how to use pagination for printing a multiple page document.
Working with Print Services and Attributes ndash; this section teaches you about print services, how to specify the print data format, and how to create print job using the javax.print package.
Printing the Contents of a User Interface – this section explains how to print the contents of a window or a frame.
Printing Support in Swing Components - this section provides a brief description of the related printing functionality inSwing and refers to specific Swing classes and interfaces.
Java打印技术的核心代码,可以参考下面的HelloWOrldPrinter,基本上来说就是建立PrinterJob与Printable接口的关系即可。
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.print.*; public class HelloWorldPrinter implements Printable, ActionListener { public int print(Graphics g, PageFormat pf, int page) throws PrinterException { if (page > 0) { /* We have only one page, and 'page' is zero-based */ return NO_SUCH_PAGE; } /* User (0,0) is typically outside the imageable area, so we must * translate by the X and Y values in the PageFormat to avoid clipping */ Graphics2D g2d = (Graphics2D)g; g2d.translate(pf.getImageableX(), pf.getImageableY()); /* Now we perform our rendering */ g.drawString("Hello world!", 100, 100); /* tell the caller that this page is part of the printed document */ return PAGE_EXISTS; } public void actionPerformed(ActionEvent e) { PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintable(this); boolean ok = job.printDialog(); if (ok) { try { job.print(); } catch (PrinterException ex) { /* The job did not successfully complete */ } } } public static void main(String args[]) { UIManager.put("swing.boldMetal", Boolean.FALSE); JFrame f = new JFrame("Hello World Printer"); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {System.exit(0);} }); JButton printButton = new JButton("Print Hello World"); printButton.addActionListener(new HelloWorldPrinter()); f.add("Center", printButton); f.pack(); f.setVisible(true); } } |
本博在是将JPanel中的内容进行打印,直接将panel实现Printable接口即可,但是打印出来的页面上只有部分的Panel内容,特别是部分横向内容丢失,使用scale进行修正即可。
@Override public int print(Graphics g, PageFormat pf, int page) throws PrinterException { if (page > 0) { return NO_SUCH_PAGE; } Graphics2D g2d = (Graphics2D) g; g2d.translate(pf.getImageableX(), pf.getImageableY()); g2d.scale(0.9, 0.9); this.setSize(800, 900); this.printAll(g2d); return PAGE_EXISTS; } |
另外,有一个关于equals方法的小疑问:
出现编译错误:The method equals(VUserGroup) of type VUserGroup must override or implement a supertype method
@Override public boolean equals(VUserGroup one) { if (this.getUserId().equals(one.getUserId())) { return true; } else { return false; } } |
正常的代码
public boolean equals(Object obj) { VUserGroup one = (VUserGroup) obj; if (this.getUserId().equals(one.getUserId())) { return true; } else { return false; } } |
最新内容请见作者的GitHub页:http://qaseven.github.io/