Por que eu tenho que chamar GraphicsEnvorinment.registerFont () mesmo se eu minha fonte foi criada a partir do arquivo?

Estou desenvolvendo uma aplicação web que usa o JFreeChart para renderizar gráficos. No entanto, quando a dose do servidor não tiver nenhuma fonte em chinês instalada, o JFreeChart não exibirá o caractere chinês, mesmo se eu tiver definido a fonte.

Então eu escrevo um pequeno código de teste e descubro que adicionar essa linha de código antes de desenhar o gráfico pode resolver o problema.

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);

Então minhas perguntas são -

Por que preciso registrar a fonte na JVM mesmo se eu criar minha fonte em Arquivo? Dose que significa JFreeChart não usa a fonte que eu configurei diretamente?

Quando eu implantar meu programa no servidor, mesmo que eu adicione essa linha de código, ele não exibirá caracteres chineses.Como faço para usar sempre a fonte que eu configurei para exibir o caractere corretamente em todo o ambiente?

Eu sei que posso fazer umafallback diretório em$JAVA_HOME/jre/lib e coloquei minha fonte nela. Mas essa dose não explica porque o JFreeChart não pode ser exibido com a fonte que eu configurei.

ATUALIZAR

Tenho certeza de que a fonte foi carregada corretamente e, portanto,registerFont() return true quando eu implantar o programa no Tomcat.

ATUALIZAÇÃO 2

De acordo comFAQ JAVA 2D, agora eu percebo que tenho que ligarregisterFont() a fim de tornar minha própria fonte "instalada" na JVM, e minha fonte estará disponível através deFont construtor.

A partir do Java SE 6, existe um método: GraphicsEnvironment.registerFont () que lhe dá a capacidade de disponibilizar uma fonte "criada" para os construtores Font e de ser listada via APIs de enumeração de fontes. Font.createFont () e este método combinam-se para fornecer uma maneira de "instalar" uma fonte no JRE em execução, para que ela esteja disponível exatamente como as fontes O / S instaladas. No entanto, essa fonte não persiste em invocações do JRE.

Mas como eu já tenhoFont instâncias criadas / derivadas decreateFont(), por que meu programa ainda precisa criar outroFont ?

A seguir está o código que usei, ele simplesmente exibe um gráfico no formato PNG. Se você quiser executar o código, você deve alterar o local de saída e a fonte para atender às suas necessidades, eaqui está o link do SourceForge para fonte chinesa eu uso no código.

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;
  }
}

questionAnswers(3)

yourAnswerToTheQuestion