acerbic coffee
走自己的路,让别人跑步
posts - 26,comments - 14,trackbacks - 0

        最近项目遇到linux上显示JFreeChart图形,在网上搜索到了很多关于此方面的信息,详细的也有,不过大多环境都是redhat+jdk1.4但乍一看说得不太清楚,搞了半天终于搞定了,现解释,
        环境:suse10,jdk1.4.2
        相同部分就不再多说,以下部分内容,挑csdn上一个详细的文章粘贴出来,顺便总结一下

一、  错误描述

基本上的错误都是以下错误

 1java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
 2at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
 3at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:125)
 4at java.lang.Class.forName0(Native Method)
 5at java.lang.Class.forName(Class.java:140)
 6at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:62)
 7at java.awt.Font.initializeFont(Font.java:309)
 8at java.awt.Font.<init>(Font.java:345)
 9at org.jfree.chart.plot.PiePlot.<clinit>(PiePlot.java:186)
10at org.jfree.chart.ChartFactory.createPieChart3D(ChartFactory.java:416)

错误原因么,大概就是jvm找不到字体文件

二、问题解决:

写一个测试系统环境的小程序

 

1public class PrintLocale {
2    public static void main(String[] args) {
3        System.out.println(System.getProperty("user.language"));
4        System.out.println(System.getProperty("user.region"));
5        System.out.println(System.getProperty("file.encoding"));
6        System.out.println(System.getProperty("os.version"));
7    }

8}

9

    例如输入结果:
zh
CN
GB2312
2.4.19-4GB
对于我们来说关注的地方其实只有第一行“zh”,说明目前环境是简体中文,

从Sun的文档"Adding Fonts to the Java Runtime"[参见参考文献1]中,我们可以得知: 在英文环境下,字体属性由无后缀的font.properties 定义。为了一些操作系统的特殊问题,字体属性文件的名字可以加入操作系统的版本号作为后缀。例如,Solaris 2.5.1 不支持 TrueType 字体,所以字体属性文件font.properties.5.5.1 将只包含 F3 字体。在大多数操作系统中,版本后缀的值由System.getProperty("os.version")来确定。

如果环境是日文、韩文、简体中文或繁体中文,就必须使用相应于特定环境的 font.properties 文件。这些文件可以通过文件名后边加上相应的国家或者locale后缀识别,格式为font.properties.<locale>。该<locale>实际上由<language>_<region>_<encoding>三部分构成。而<language>、<region>和<encoding>分别对应了系统属性(由System.getProperty方法返回的字符串)"user.language"、"user.region"和"file.encoding"。而这个font.properties.<locale>名也可以跟操作系统的版本结合使用。

概括的讲,Java按照以下顺序搜索字体属性文件:

 

 1font.properties.<language>_<region>_<encoding>.<osVersion>
 2font.properties.<language>_<region>_<encoding>
 3font.properties.<language>_<region>.<osVersion>
 4font.properties.<language>_<region>
 5font.properties.<language>_<encoding>.<osVersion>
 6font.properties.<language>_<encoding>
 7font.properties.<language>_<osVersion>
 8font.properties.<language>
 9font.properties.<encoding>.<osVersion>
10font.properties.<encoding>
11font.properties.<osVersion>
12font.properties
13

所以我们需要检查%JAVA_HOME%/jre/lib/fonts目录下是否存在font.properties.zh文件,如果没有则新建一个,或者copy font.properties

1cp font.properties font.properties.zh


三、检查

很多人介绍的都是copy或引用/usr/share/fonts/zh_CN/TrueType目录下的中文字体

但是有些suse上不存在/usr/share/fonts这个目录,所以有时候会叫人感觉很头疼,但是仔细检查你会发现路经/usr/lib/X11/font/truetype存在,所以并不一定要/usr/share/fonts/zh_CN/TrueType这个文件夹

用vi打开/usr/lib/X11/font/truetype/fonts.dir文件,

搜索gbk或gb2312(一个人需要而定),将其中的一个拷贝出来此处,我们搜索gb18030,在font.dir中找到
 -misc-ZYSong18030-medium-r-normal--0-0-0-0-c-0-iso10646-1

按照 java 的字体规则改为 -misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1

我们选用字体 -misc-ZYSong18030-medium-r-normal--0-0-0-0-c-0-iso10646-1 是因为在 redhat 7.3 和 redhat 8.0 上都能用

打开font.properties.zh,将里面内容替换如下:

  1# @(#)font.properties.zh.Redhat.linux 1.4 02/06/10
  2#
  3# Copyright 2002 Sun Microsystems, Inc. All rights reserved.
  4#
  5
  6# Component Font Mappings
  7#
  8serif.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
  9
 10serif.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 11
 12serif.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 13
 14serif.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 15
 16sansserif.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 17
 18sansserif.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 19
 20sansserif.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 21
 22sansserif.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 23
 24monospaced.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 25
 26monospaced.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 27
 28monospaced.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 29
 30monospaced.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 31
 32dialog.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 33
 34
 35dialog.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 36
 37dialog.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 38
 39dialog.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 40
 41dialoginput.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 42
 43dialoginput.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 44
 45dialoginput.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 46
 47dialoginput.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 48# Missing Glyph Character
 49#
 50default.char=274f
 51
 52# Component Font Character Encodings
 53#
 54fontcharset.serif.0=sun.io.CharToByteISO8859_1
 55fontcharset.serif.1=sun.awt.motif.CharToByteX11GBK
 56
 57fontcharset.sansserif.0=sun.io.CharToByteISO8859_1
 58fontcharset.sansserif.1=sun.awt.motif.CharToByteX11GBK
 59
 60fontcharset.monospaced.0=sun.io.CharToByteISO8859_1
 61fontcharset.monospaced.1=sun.awt.motif.CharToByteX11GBK
 62
 63fontcharset.dialog.0=sun.io.CharToByteISO8859_1
 64fontcharset.dialog.1=sun.awt.motif.CharToByteX11GBK
 65
 66fontcharset.dialoginput.0=sun.io.CharToByteISO8859_1
 67fontcharset.dialoginput.1=sun.awt.motif.CharToByteX11GBK
 68
 69# Exclusion Ranges
 70#
 71
 72# XFontSet Information
 73#
 74fontset.serif.plain=\
 75-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 76
 77fontset.serif.italic=\
 78-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 79
 80fontset.serif.bold=\
 81-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 82
 83fontset.serif.bolditalic=\
 84-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 85
 86fontset.sansserif.plain=\
 87-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 88
 89fontset.sansserif.italic=\
 90-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 91
 92fontset.sansserif.bold=\
 93-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 94
 95fontset.sansserif.bolditalic=\
 96-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
 97
 98fontset.monospaced.plain=\
 99-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
100
101fontset.monospaced.italic=\
102-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
103
104fontset.monospaced.bold=\
105-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
106
107fontset.monospaced.bolditalic=\
108-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
109
110fontset.dialog.italic=\
111-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
112
113fontset.dialog.bold=\
114-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
115
116fontset.dialog.bolditalic=\
117-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
118
119fontset.dialog.plain=\
120-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
121
122fontset.dialoginput.italic=\
123-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
124
125fontset.dialoginput.bold=\
126-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
127
128fontset.dialoginput.bolditalic=\
129-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
130
131fontset.dialoginput.plain=\
132-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
133
134#fontset.default=\
135#-b&h-lucida-medium-r-normal-sans-*-%d-*-*-p-*-iso10646-1,\
136#-tlc-song-medium-r-normal--*-%d-*-*-c-*-gbk-0
137
138fontset.default=\
139-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
140
141


仔细观察你可以发现替换的内容基本都是".0"的内容

特别要注意

 1# Missing Glyph Character
 2#
 3default.char=274f
 4
 5# Component Font Character Encodings
 6#
 7fontcharset.serif.0=sun.io.CharToByteISO8859_1
 8fontcharset.serif.1=sun.awt.motif.CharToByteX11GBK
 9
10fontcharset.sansserif.0=sun.io.CharToByteISO8859_1
11fontcharset.sansserif.1=sun.awt.motif.CharToByteX11GBK
12
13fontcharset.monospaced.0=sun.io.CharToByteISO8859_1
14fontcharset.monospaced.1=sun.awt.motif.CharToByteX11GBK
15
16fontcharset.dialog.0=sun.io.CharToByteISO8859_1
17fontcharset.dialog.1=sun.awt.motif.CharToByteX11GBK
18
19fontcharset.dialoginput.0=sun.io.CharToByteISO8859_1
20fontcharset.dialoginput.1=sun.awt.motif.CharToByteX11GBK
21
22# Exclusion Ranges
23#
24
25# XFontSet Information
26#
27
28

修改后的词部分内容与原文件内容不一致,注意修改此处

最后值得注意的是在font.properties.zh内容的结尾加上

1appendedfontpath=/usr/lib/X11/fonts/truetype

这是为了让jvm去寻找字体文件

你也可以将环境变量export JAVA_FONTS=/usr/lib/X11/fonts/truetype假如系统或你的账号启动sh的.profile里

至此中文问题配置完毕

四、其他问题,

如果使用tomcat 设置环境变量:
CATALINA_OPTS="-Djava.awt.headless=true"
export CATALINA_OPTS
(如果你想每次开机自动生效,则可把这两句写入系统或者你的账号启动sh的.profile里)

到此关于linux显示jfreechart图像显示乱码的环境配置问题既可以得到解决,其余基本就是代码的问题,可仔细检查jfreechat文档,

jfreechart关注点:

设置Legend的font
x轴坐标名称的font
y轴坐标名称的font


                

posted on 2008-07-01 18:46 acerbic coffee 阅读(3995) 评论(5)  编辑  收藏 所属分类: 个人笔记

FeedBack:
# re: JFreeChart在linux端图片显示乱码问题解决
2008-12-25 10:19 | 刘鑫
其实根本没有那么麻烦
直接天网ftp搜索下载simsun.ttf
然后在jre/lib/fonts下面新建fallback文件夹,将simsun.ttf放入即可  回复  更多评论
  
# re: JFreeChart在linux端图片显示乱码问题解决[未登录]
2010-09-16 13:57 | liuyang
楼上正解,感谢!  回复  更多评论
  
# re: JFreeChart在linux端图片显示乱码问题解决
2012-06-18 18:43 | bincrack
绝对正解 @liuyang
  回复  更多评论
  
# re: JFreeChart在linux端图片显示乱码问题解决
2013-10-16 13:37 | zzs
是的@刘鑫
  回复  更多评论
  
# re: JFreeChart在linux端图片显示乱码问题解决
2014-02-28 10:51 | haer
楼上绝对正解  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: