0

Java 印刷 API を使用してデータの書式設定されたビューを印刷する機能を備えた Java アプリケーションを作成しています。以下は、印刷を行うコードの簡単な関連スニペットです。

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

この回答の助けを借りて解決しました。これが Swing コンポーネントではなく印刷 API にのみ影響する理由を説明することはできませんが、印刷 API でフォントを使用するには、/srcフォルダーの下にフォントを含め、getResourceAsStream()メソッドを使用してアクセスする必要がありました。

少なくとも私の場合、Swing はシステム フォントと外部フォント ファイルにアクセスできましたが、Printing API または Graphics2D はファイルを InputStream としてロードする必要があったようです。

于 2013-05-14T21:27:30.873 に答える