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.
Tenho certeza de que a fonte foi carregada corretamente e, portanto,registerFont()
return true quando eu implantar o programa no Tomcat.
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;
}
}