JFreeChartを使用してグラフをレンダリングするWebアプリケーションを開発しています。ただし、サーバーに中国語のフォントがインストールされていない場合、フォントを設定してもJFreeChartで漢字が表示されません。
次に、小さなテストコードを記述し、グラフを描画する前にこのコード行を追加することで問題を解決できることを確認します。
GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);
だから私の質問は-
ファイルからフォントを作成しても、JVMにフォントを登録する必要があるのはなぜですか?それは、JFreeChartが私が直接設定したフォントを使用しないことを意味しますか?
プログラムをサーバーにデプロイすると、このコード行を追加しても、漢字が表示されません。すべての環境で文字を正しく表示するために、設定したフォントを常に使用するようにするにはどうすればよいですか?
fallback
ディレクトリを作成し$JAVA_HOME/jre/lib
てフォントを入れることができることはわかっています。しかし、それでは、JFreeChartが設定したフォントで表示できない理由を説明できません。
アップデート
フォントが正しくロードされたと確信しているのでregisterFont()
、プログラムをTomcatにデプロイするとtrueが返されます。
更新2
JAVA 2D FAQによるとregisterFont()
、自分のフォントをJVMに「インストール」するために呼び出す必要があることに気付きました。私のフォントは、Font
コンストラクターを介して使用できるようになります。
Java SE 6の時点で、メソッドGraphicsEnvironment.registerFont()があります。これにより、「作成された」フォントをフォントコンストラクターで使用できるようにし、フォント列挙APIを介して一覧表示することができます。Font.createFont()とこのメソッドを組み合わせて、実行中のJREにフォントを「インストール」する方法を提供し、O/Sでインストールされたフォントと同じように使用できるようにします。ただし、このフォントはJRE呼び出し間で保持されません。
しかし、私はすでにFont
インスタンスを作成/派生してcreateFont()
いるので、なぜ私のプログラムはまだ他のインスタンスを作成する必要がないのFont
ですか?
以下は私が使用したコードで、PNG形式でチャートを出力するだけです。コードを実行する場合は、必要に応じて出力場所とフォントを変更する必要があります。これは、コードで使用する中国語フォントのSourceForgeリンクです。
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.io.File;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
public class Problem {
public static void main(String[] args) throws Exception {
setJFreeChartTheme();
PieDataset dataset = createDataSet();
JFreeChart chart = ChartFactory.createPieChart(
"Chinese Testing", dataset, true, true, false);
ChartUtilities.saveChartAsJPEG(new File("/tmp/output.png"),
chart, 800, 600);
System.out.println("Done");
}
private static void setJFreeChartTheme() throws Exception {
Font font = loadFont();
//==================================================================
GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);
//==================================================================
StandardChartTheme theme = new StandardChartTheme("Chinese font", true);
theme.setExtraLargeFont(font.deriveFont(Font.BOLD, 20));
theme.setLargeFont(font.deriveFont(Font.BOLD, 16));
theme.setRegularFont(font.deriveFont(Font.PLAIN, 14));
theme.setSmallFont(font.deriveFont(Font.PLAIN, 12));
ChartFactory.setChartTheme(theme);
}
private static Font loadFont() throws Exception {
File file = new File("/tmp/wqy-zenhei.ttc");
return Font.createFont(Font.TRUETYPE_FONT, file);
}
private static PieDataset createDataSet() {
DefaultPieDataset dataset = new DefaultPieDataset();
dataset.setValue("種類1", Integer.valueOf(1));
dataset.setValue("種類2", Integer.valueOf(2));
dataset.setValue("種類3", Integer.valueOf(3));
return dataset;
}
}