Warum muss ich GraphicsEnvorinment.registerFont () aufrufen, auch wenn ich meine Schriftart aus einer Datei erstellt habe?

Ich entwickle eine Webanwendung, die JFreeChart zum Rendern von Diagrammen verwendet. Wenn auf dem Server jedoch keine chinesische Schrift installiert ist, zeigt die JFreeChart-Dosis kein chinesisches Schriftzeichen an, selbst wenn ich die Schrift eingestellt habe.

Dann schreibe ich einen kleinen Testcode und finde heraus, dass diese Codezeile hinzugefügt wird, bevor das Diagramm gezeichnet wird, um das Problem zu lösen.

GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);

Also meine Fragen sind -

Warum muss ich eine Schriftart in JVM registrieren, auch wenn ich meine Schriftart aus einer Datei erstelle? Bedeutet das, dass JFreeChart nicht die Schriftart verwendet, die ich direkt festgelegt habe?

Wenn ich mein Programm auf dem Server bereitstelle, werden keine chinesischen Zeichen angezeigt, auch wenn ich diese Codezeile hinzufüge.Wie verwende ich immer die von mir festgelegte Schriftart, um Zeichen in allen Umgebungen korrekt anzuzeigen?

Ich weiß, dass ich eine machen kannfallback Verzeichnis in$JAVA_HOME/jre/lib und lege meine Schrift hinein. Aber diese Dosis erklärt nicht, warum JFreeChart nicht mit der von mir eingestellten Schriftart angezeigt werden kann.

AKTUALISIEREN

Ich bin mir ziemlich sicher, dass die Schrift richtig geladen wurde und dosiereregisterFont() Geben Sie true zurück, wenn ich das Programm in Tomcat implementiere.

UPDATE 2

GemäßJAVA 2D FAQJetzt wird mir klar, dass ich anrufen mussregisterFont() Damit meine eigene Schriftart in JVM "installiert" wird, ist meine Schriftart über verfügbarFont Konstrukteur.

Ab Java SE 6 gibt es eine Methode: GraphicsEnvironment.registerFont (), mit der Sie den Font-Konstruktoren eine "erstellte" Schriftart zur Verfügung stellen und über Font-Enumerations-APIs auflisten können. Font.createFont () und diese Methode bieten zusammen die Möglichkeit, eine Schriftart in die ausgeführte JRE zu "installieren", damit sie genau so verfügbar ist, wie die von O / S installierten Schriftarten. Diese Schriftart bleibt jedoch bei JRE-Aufrufen nicht erhalten.

Aber da habe ich schonFont Instanzen erstellt / abgeleitet voncreateFont(), warum muss mein dosen programm noch andere erstellenFont ?

Im folgenden Code habe ich einfach ein Diagramm im PNG-Format ausgegeben. Wenn Sie den Code ausführen möchten, sollten Sie den Ausgabepfad und die Schriftart entsprechend Ihren Anforderungen ändernHier ist der SourceForge-Link für chinesische Schrift verwende ich im Code.

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

Antworten auf die Frage(3)

Ihre Antwort auf die Frage