Почему я должен вызывать 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 не может отображаться с шрифтом, который я установил.

UPDATE

Я уверен, что шрифт был загружен правильно, поэтомуregisterFont() верните true, когда я разверну программу в Tomcat.

UPDATE 2

В соответствии с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;
  }
}

Ответы на вопрос(3)

Ваш ответ на вопрос