Почему я должен вызывать GraphicsEnvorinment.registerFont (), даже если мой шрифт был создан из файла?
Я разрабатываю веб-приложение, которое использует JFreeChart для визуализации диаграммы. Тем не менее, когда на серверной дозе не установлен ни один китайский шрифт, JFreeChart не отображает китайский символ, даже если я установил шрифт.
Затем я пишу небольшой тестовый код и выясняю, что добавление этой строки кода перед рисованием диаграммы может решить проблему.
GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);
Так что мои вопросы -
Why do I have to register font into JVM even if I create my font from File ? Dose that mean JFreeChart do not use the font I set directly ?
When I deploy my program into server, even if I add this line of code, it dose not display Chinese characters. How do I make it always use the font I set in order to display character properly in all environment ?
Я знаю, что могу сделатьfallback
каталог в$JAVA_HOME/jre/lib
и вставь в него мой шрифт. Но эта доза не объясняет, почему JFreeChart не может отображаться с шрифтом, который я установил.
Я уверен, что шрифт был загружен правильно, поэтомуregisterFont()
верните true, когда я разверну программу в Tomcat.
В соответствии сJAVA 2D FAQтеперь я понимаю, что мне нужно позвонитьregisterFont()
чтобы сделать мой собственный шрифт & quot; установленным & quot; в JVM, и мой шрифт будет доступен черезFont
конструктор.
As of Java SE 6, there is a method : GraphicsEnvironment.registerFont() which gives you the ability to make a "created" font available to Font constructors and to be listed via Font enumeration APIs. Font.createFont() and this method combine to provide a way to "install" a Font into the running JRE so it is available just as O/S installed fonts are. However this Font does not persist across JRE invocations.
Но, так как у меня уже есть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;
}
}