import javax.print.PrintServiceLookup;
import javax.print.PrintService;
import javax.print.DocFlavor;
import javax.print.ServiceUI;
import javax.print.attribute.*;
import javax.swing.UIManager;
import javax.print.DocPrintJob;
import javax.print.attribute.standard.Copies;
import javax.print.event.PrintJobAdapter;
import javax.print.event.PrintJobEvent;
import javax.print.SimpleDoc;
import java.io.ByteArrayInputStream;class Pr {
class myPrintJob extends PrintJobAdapter {
 public void printDataTransferCompleted(PrintJobEvent pje) {
System.out.println(
"调用此方法来通知客户端,已成功地将数据传输到打印服务,客户端可以释放分配给该数据的本地资源。");
}
 public void printJobCanceled(PrintJobEvent pje) {
  System.out.println(
  "调用此方法来通知客户端,作业已被用户或程序取消。");
 }
 public void printJobCompleted(PrintJobEvent pje) {
  System.out.println(
  "调用此方法来通知客户端,作业已成功完成。");
 }
 public void printJobFailed(PrintJobEvent pje) {
  System.out.println("调用此方法来通知客户端,无法成功完成作业,必须重新提交该作业。");
 }
 public void printJobNoMoreEvents(PrintJobEvent pje) {
  System.out.println("调用此方法来通知客户端,不需要再提供事件.");
 
 }
 public void printJobRequiresAttention(PrintJobEvent pje) {
  System.out.println(
  "调用此方法来通知客户端,可能会发生一些用户可纠正的问题(例如打印机缺纸).");
 }}
PrintService se = null;
PrintService[] services = null;
PrintRequestAttributeSet attrs = null;
DocFlavor flavor = null;
PrintService select = null;
DocPrintJob job = null;
String str = null;
ByteArrayInputStream os = null;
DocAttributeSet das = new HashDocAttributeSet();
SimpleDoc doc = null;

public Pr() {
se = PrintServiceLookup.lookupDefaultPrintService();
services = PrintServiceLookup.lookupPrintServices(null, null);
attrs = new HashPrintRequestAttributeSet();
flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
str = "这是个测试!";
os = new ByteArrayInputStream(str.getBytes());
doc = new SimpleDoc(os, flavor,null);
}
public void showDialog() {
select = ServiceUI.printDialog(null,200,200,services,se,flavor,attrs);
job = select.createPrintJob();
job.addPrintJobListener(new myPrintJob());

attrs.add(new Copies(2));
doc = new SimpleDoc(os, flavor,null);
if (select != null)
go();
}

public void go() {
try {
job.print(doc,attrs);
} catch (Exception e) {
e.printStackTrace();
}
}
}public class Test { public static void main(String[] args) throws Exception {
Pr p = new Pr();
p.showDialog();

}
}以上是我学习JDK1.4的打印API,试验写的.
打印总是不能打印出预期的结果.首先中文是乱码,还有就是不能打印完全.
注册了临听器myPrintJob,但不知里面应该如何写.
请帮小弟看一下.

解决方案 »

  1.   

    哦.这样啊..写时不是这样...拷上来没有好好排一下....SORRY.
    整理一下问题.
    class myPrintJob extends PrintJobAdapter {
      public void printDataTransferCompleted(PrintJobEvent pje) {}
      public void printJobCanceled(PrintJobEvent pje) {}
    public void printJobCompleted(PrintJobEvent pje) {}
    public void printJobFailed(PrintJobEvent pje) {}
    public void printJobNoMoreEvents(PrintJobEvent pje) {}
    public void printJobRequiresAttention(PrintJobEvent pje) {}
    }class Pr {
    PrintService se = null;
    PrintService[] services = null;
    PrintRequestAttributeSet attrs = null;
    DocFlavor flavor = null;
    PrintService select = null;
    DocPrintJob job = null;
    String str = null;
    ByteArrayInputStream os = null;
    DocAttributeSet das = new HashDocAttributeSet();
    SimpleDoc doc = null; public Pr() {
    se = PrintServiceLookup.lookupDefaultPrintService();
    services = PrintServiceLookup.lookupPrintServices(null, null);
    attrs = new HashPrintRequestAttributeSet();
    flavor = DocFlavor.INPUT_STREAM.AUTOSENSE;
    str = "This is test!";     //将要打印的字符串
    os = new ByteArrayInputStream(str.getBytes());
    doc = new SimpleDoc(os, flavor,null);
    }
    public void showDialog() {
    select = ServiceUI.printDialog(
    null,200,200,services,se,flavor,attrs);
    job = select.createPrintJob();
    job.addPrintJobListener(new myPrintJob());
    attrs.add(new Copies(2));
    doc = new SimpleDoc(os, flavor,null);
    if (select != null)
    go();
    } public void go() {
    try {
    job.print(doc,attrs);//打印
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }public class Test {
    public static void main(String[] args) throws Exception {
    Pr p = new Pr();
    p.showDialog();
    }
    }
    其实主要想问的是怎么写监听打印完成的监听器.
    我重写了所有PrintJobAdapter的方法,发现调用两个方法//已成功地将数据传输到打印服务,客户端可以释放分配给该数据的本地资源。
    public void printDataTransferCompleted(PrintJobEvent pje)
    //调用此方法来通知客户端,不需要再提供事件。
    public void printJobNoMoreEvents(PrintJobEvent pje)
    现在调用job.print(doc,attrs);打印机有反应,但只打第一个字符,有时只打一小段字符串.从没用过JDK1.4的打印API,请那位看一下那里错了.