Dlaczego muszę wywoływać GraphicsEnvorinment.registerFont (), nawet jeśli I my Font został utworzony z pliku?

Opracowuję aplikację internetową, która używa JFreeChart do renderowania wykresu. Jednakże, gdy dawka serwera nie ma zainstalowanej chińskiej czcionki, dawka JFreeChart nie wyświetla chińskiego znaku, nawet jeśli ustawiłem czcionkę.

Następnie piszę mały kod testowy i stwierdzam, że dodanie tego wiersza kodu przed narysowaniem wykresu może rozwiązać problem.

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);

Więc moje pytania są -

Dlaczego muszę zarejestrować czcionkę w JVM, nawet jeśli tworzę czcionkę z pliku? Dawka, która oznacza, że ​​JFreeChart nie używa czcionki ustawionej bezpośrednio?

Kiedy wdrażam mój program na serwerze, nawet jeśli dodam ten wiersz kodu, nie wyświetla on chińskich znaków.Jak sprawić, aby zawsze używał ustawionej czcionki, aby poprawnie wyświetlać znaki we wszystkich środowiskach?

Wiem, że mogę zrobićfallback katalog w$JAVA_HOME/jre/lib i włóż do niego moją czcionkę. Ale ta dawka nie wyjaśnia, dlaczego JFreeChart nie może wyświetlać z ustawioną czcionką.

AKTUALIZACJA

Jestem pewien, że czcionka była poprawnie załadowana, a więc dawkaregisterFont() zwraca true, gdy wdrażam program w Tomcat.

AKTUALIZACJA 2

WedługJAVA 2D FAQ, teraz zdaję sobie sprawę, że muszę zadzwonićregisterFont() aby moja własna czcionka została „zainstalowana” w JVM, a moja czcionka będzie dostępna przez cały czasFont konstruktor.

Począwszy od Java SE 6, istnieje metoda: GraphicsEnvironment.registerFont (), która daje możliwość udostępnienia „stworzonej” czcionki konstruktorom czcionek i wyświetlenia jej na liście interfejsów API wyliczania czcionek. Font.createFont () i ta metoda łączą się w celu „zainstalowania” czcionki w działającym JRE, dzięki czemu jest ona dostępna tak, jak czcionki zainstalowane w O / S. Jednak ta czcionka nie utrzymuje się w wywołaniach JRE.

Ale odkąd już mamFont instancje utworzone / pochodzące zcreateFont(), dlaczego dosen mój program nadal musi tworzyć inneFont ?

Oto kod, którego użyłem, po prostu wyświetla wykres w formacie PNG. Jeśli chcesz uruchomić kod, powinieneś zmienić lokalizację wyjściową i czcionkę, aby dopasować ją do potrzeb itutaj jest link SourceForge dla chińskiej czcionki używam w kodzie.

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