PrintJobPrintable类 打印主要通过PrintJob类的print的回调函数来实现打印的全部工作PrintJob类是抽象类不能new一个实例但通过它的一个静态方法getPrintJob就可以得到一个PrintJob句柄有了这样一个操纵桿我们可以随时打开开关叫它快给我打印!(print)如果这样它会问你叫我打印什么呢?即回调你的打印内容如果你没有打印的内容它会抛出一句话没有东西嘛!(PrintException)否则它就会忠实的根据需求打印 所以你应该提供一个可打印的内容(Printable)只有一个方法需要你实现 print(Graphics g PageFormat pf int pageIndex ); 你所有的打印控制其实都是在该方法中实现提供一个最简单的例子 import javaawtGraphics; import javaawtprint*; public class TestPrint { public static void main(String[] args) { PrintJob job = PrintJobgetPrintJob();//获得句柄 jobsetPrintable(new Hello());//告诉job到哪里找打印内容 try{ jobprint();//快给我打印! }catch(PrintException e) { Systemoutprintln(没有东西嘛!);//或打印机硬件问题 } } class Hello implements Printable {//可打印的内容 public int print(Graphics g //可以任意画打印的内容的白纸 PageFormat pf // 打印格式缺省 int pageIndex ) {// 页码从开始 if(pageIndex != )return NO_SUCH_PAGE;//停止打印 gdrawString(Hello World!);//在纸上画字符串 return PAGE_EXITS;//继续打印 } } } 怎么样?够方便吧发挥你的想象在Graphics上画你喜欢的东西吧! PageFormatPaper类 在例子中的Printable的print()方法的参数列表中PageFormat类有点陌生顾名思义它是打印的格式我们在打印过程中选择的横打纵打页边距都是由PageFormat控制的默认的格式是Letter纸普通的页边距(通过PrintJob的defaultPage得到)在你得到PageFormat实例后你可以轻松设置打印的区域(不能直接设置纸张的大小)打印方向如何改变纸张的大小呢?java自带的页面设置有几种典型的纸张类型(AA等)如果要自定义纸张大小从PageFormat实例中的getPaper()方法获得名为Paper的实例再通过Paper的setSize()改变纸张实际大小讲了这么多看一个例子 import javaawt*; import javaawtprint*; public class TestFormat { public static void main(String[] args) { PrinterJob job = PrintJobgetPrinterJob(); PageFormat pageFormat = jobdefaultPage();//得到默认页格式 double inch = ;//一英寸 Paper paper = pageFormatgetPaper();//得到页面格式的纸张 papersetSize( * inch * inch);//纸张大小为英寸见方 pageFormatsetImageableArea( inch//坐标x即左页边距英寸 inch//坐标y即上页边距英寸 papergetWidth() * inch//宽度英寸英寸(左右各英寸) papergetHeight() * inch);//高度英寸英寸(上下各英寸) pageFormatsetPaper(paper);//将该纸张作为格式 jobsetPrintable(new Rect()pageFormat);//不止提供打印内容还有格式 if(jobprintDialog()) {//熟悉的打印设置对话框OK返回trueCancel返回false try{ jobprint(); }catch(PrinterException e){ Systemoutprintln(e); } } } class Rect implements Printable { public int print(Gaphics gPageFormat pageFormatint pageIndex) { if(pageIndex != )return NO_SUCH_PAGE; gfillRect();//画一个的正方形 return PAGE_EXISTS; } } } 相对于TestPrintjava现在的例子复杂多了所有新添加的内容都有注释本来想打印的正方形但当你兴沖沖去取打印结果时你只能得到一个小的多的正方形(实际上有 = 那么大)因为你是从纸的左上角开始画但有一英寸的页边距让你的构想变小了 如果你打印的东西是统一格式的(大部分情况都是如此)打印就变得如此简单关键是你在纸上画的东西根据页码(pageIndex)的不同能打印不同的东西 血的教训千万在实现的print()方法中加入控制打印结束的语句(NO_SUCH_PAGE)否则打印机会孜孜不倦的打到它打不动位置我的抽屉内还有十几张打印机的杰作如果不是我强行关闭电源它的发挥远不止这些 预览类的构造函数是这样的 public PrintPreviewer(Pageable pint page){ pageable=p; pageIndex=page; printComponent=new PrintComponent(nullnull); printComponentsetBorder(BorderFactorycreateBevelBorder( BevelBorderRAISED)); buildLayout(); displayPage(pageIndex); } protected void buildLayout(){ setLayout(new BorderLayout()); JPanel panel=new JPanel(); panelsetLayout(new FlowLayout(FlowLayoutCENTER)); paneladd(printComponent); scrollPane=new JScrollPane(panel); add(scrollPaneBorderLayoutCENTER); add(getBottomPanel()BorderLayoutSOUTH); addListeners(); } |