0

我正在编写一个 Java 应用程序,它能够使用 Java 打印 API 打印数据的格式化视图。下面是我的打印代码的简短相关片段:

public static void printStaffAssignments(){
    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintable(new StaffAssignmentsPrintable());
    boolean doPrint = job.printDialog();

    if (doPrint) {
        try {
            job.print();
        } catch (PrinterException e) {
           ErrorUtility.createError("Error while trying to print Staff assignments");
        }
    }
}


public static class StaffAssignmentsPrintable implements Printable{

    @Override
    public int print(Graphics g, PageFormat pf, int page)
            throws PrinterException {

        String[][] data;

        if(page == 0){
            data = FiscalYear.getInstance().getStaffAssignmentsAsStrings();
        }else{
            return NO_SUCH_PAGE;
        }

        Graphics2D g2d = (Graphics2D)g;
        g2d.translate(pf.getImageableX(), pf.getImageableY());

        final int CHART_TOP = 75;
        int y = CHART_TOP;

        g.setFont(new Font("Arial", Font.PLAIN, 10));

        for(int i = 0; i < data.length; i++){
            g.drawString(data[i][0], 35, y);
            g.drawString(data[i][1], 135, y);
            g.drawString(data[i][2], 235, y);
            g.drawString(data[i][3], 335, y);
            g.drawString(data[i][4], 435, y);
            y += 17;
        }

                ...

        return PAGE_EXISTS;
    }

}

当我从 Eclipse 中运行程序时,它的打印结果完全符合预期,但是当我将它导出为 JAR 时,它不会更改字体,而是使用我认为是系统默认值的字体。我尝试使用 Java 教程 ( http://docs.oracle.com/javase/tutorial/2d/text/fonts.html ) 中的代码并将 Arial.tff 复制到 JAR 旁边的文件夹中,并添加:

    try {
         java.awt.GraphicsEnvironment ge = 
             java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment();
         ge.registerFont(java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, new java.io.File("data/Arial.ttf")));
    } 
     ...

在调用任何打印代码之前的某个时间点,但 JAR 仍不会使用 Arial 绘制任何字符串。

有趣的是,我在程序本身中使用了设置为 Arial 字体的 JLabels,即使没有额外的 GraphicsEnvironment 代码,JAR 似乎也可以很好地加载 Arial。例如:

Font noStrike = new Font("Arial", Font.PLAIN, 12);
...
JLabel name = new JLabel(c.getFullName());
name.setFont(noStrike);

任何想法为什么我的打印代码找不到/尊重字体?

4

1 回答 1

0

最终在这个答案的帮助下解决了。我无法解释为什么这只会影响打印 API 而不会影响 Swing 组件,但为了在打印 API 中使用字体,我必须将它包含在/src文件夹下并使用getResourceAsStream()方法来访问它。

似乎,至少在我的情况下,虽然 Swing 能够访问系统字体和外部字体文件,但打印 API 或 Graphics2D 要求将文件作为 InputStream 加载。

于 2013-05-14T21:27:30.873 回答