0

我在没有真正打印概念的嵌入式平台上使用 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)
4

0 回答 0