2013-05-14 40 views
0

我正在編寫一個Java應用程序,能夠使用Java Printing API打印數據的格式化視圖。下面是我的代碼,不會打印一個簡短的相關片段:無法讓Java Print API在導出到JAR後使用字體

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繪製任何字符串。

它的有趣的部分是,我在程序本身中使用JLabels設置爲Arial字體,即使沒有額外的GraphicsEnvironment代碼,JAR似乎也加載了Arial就好了。例如:

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

任何想法爲什麼我的打印代碼無法找到/尊重字體?

+0

是你的類路徑中的字體文件?這個流程是否會阻止日蝕之外的阻擋? –

+0

嘗試通過命令提示符運行jar以查看異常是什麼。我相信這將是FileNotFoundException。 – Ric

+0

您是否嘗試過在您的圖形環境中列出所有字體的列表名稱?它是否在「爆炸」運行和從罐子運行之間發生變化? – Olaf

回答

0

this答案的幫助下完成解決。我無法解釋爲什麼這隻會影響打印API而不影響Swing組件,但爲了在打印API中使用該字體,我必須將其包含在/src文件夾下並使用getResourceAsStream()方法來訪問它。

看起來,至少在我的情況下,Swing能夠訪問系統字體和外部字體文件時,Printing API或Graphics2D要求將文件作爲InputStream加載。