我在没有真正打印概念的嵌入式平台上使用 Java 1.6,所以我正在尝试实现我自己的。我正在尝试提供我自己的类实现,与 Oracle for Java 提供的类并行,用于在 Unix 或 Windows 平台上打印,但我遇到了问题。java.awt.print.PrinterJob 类用于获取特定于平台的 PrinterJob 实例。在 Windows 上,PrinterJob.getPrinterJob() 返回 sun.print.Win32PrintJob 的实例,该实例是在 PrinterJob.getPrinterJob() 中使用系统属性 java.awt.printerjob 的反射创建的。一旦您有了 PrinterJob 的实例,您就可以使用其他 API 方法进行打印,正如本网站已多次回答的那样。我尝试使用 -Djava.awt.printerjob=initialization 运行。CustomPrinterJob 这是我的 PrinterJob 实现,但系统属性似乎在虚拟机启动时被重置,所以我在我的代码中使用 System.setProperty("java.awt.printerjob", "initialization.CustomPrinterJob") 更改它但是做这会导致 PrinterJob.getPrinterJob() 有一个 ClassNotFoundException,我本来希望它使用我的代码。我可以使用反射创建该对象的实例,所以我不确定为什么 java.awt.print.PrinterJob.getPrinterJob 方法不能。我已经在下面发布了我的代码,如果有人可以提供帮助或有任何想法,我将不胜感激。) 但这样做会导致 PrinterJob.getPrinterJob() 有一个 ClassNotFoundException,我本来希望它使用我的代码。我可以使用反射创建该对象的实例,所以我不确定为什么 java.awt.print.PrinterJob.getPrinterJob 方法不能。我已经在下面发布了我的代码,如果有人可以提供帮助或有任何想法,我将不胜感激。) 但这样做会导致 PrinterJob.getPrinterJob() 有一个 ClassNotFoundException,我本来希望它使用我的代码。我可以使用反射创建该对象的实例,所以我不确定为什么 java.awt.print.PrinterJob.getPrinterJob 方法不能。我已经在下面发布了我的代码,如果有人可以提供帮助或有任何想法,我将不胜感激。
MyPrinterJobExample.java:
package initialization;
import java.awt.AWTError;
import java.awt.print.PrinterJob;
public class MyPrinterJobExample {
// Copied from PrinterJob.getPrinterJob()
public static PrinterJob getPrinterJob() {
// Copied and Pasted the body of PrinterJob.getPrinterJob() Here
}
/**
* The Entry Point into this Application
* @param args the Command Line Arguments, which should be none
*/
public static void main(String[] args) {
try {
// Override some System Properties
System.setProperty("java.awt.printerjob", "initialization.CustomPrinterJob");
System.out.println("java.awt.printerjob: " + System.getProperty("java.awt.printerjob", null));
// Direct Creation (works)
PrinterJob p = new CustomPrinterJob();
// Reflection Creation (works)
PrinterJob p2 = (PrinterJob)Class.forName("initialization.CustomPrinterJob").newInstance();
// Copied from PrinterJob.getPrinterJob (works?)
PrinterJob p3 = MyPrinterJobExample.getPrinterJob();
// PrinterJob.getPrinterJob (fails)
PrinterJob p4 = PrinterJob.getPrinterJob();
} catch(Throwable t) {
t.printStackTrace(System.err);
}
}
}
CustomPrinterJob.java:
package initialization;
public class CustomPrinterJob extends PrinterJob {
// Assume the Necessary Abstract Functions are Implemented
}
输出:
java.awt.printerjob: initialization.CustomPrinterJob
Creating CustomPrinterJob
Creating CustomPrinterJob
Creating CustomPrinterJob
java.awt.AWTError: PrinterJob not found: initialization.CustomPrinterJob
at java.awt.print.PrinterJob$1.run(PrinterJob.java:66)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.print.PrinterJob.getPrinterJob(PrinterJob.java:59)
at initialization.MyPrinterJobExample.main(MyPrinterJobExample.java:52)