最近項(xiàng)目遇到linux上顯示JFreeChart圖形,在網(wǎng)上搜索到了很多關(guān)于此方面的信息,詳細(xì)的也有,不過(guò)大多環(huán)境都是redhat+jdk1.4但乍一看說(shuō)得不太清楚,搞了半天終于搞定了,現(xiàn)解釋,
環(huán)境:suse10,jdk1.4.2
相同部分就不再多說(shuō),以下部分內(nèi)容,挑csdn上一個(gè)詳細(xì)的文章粘貼出來(lái),順便總結(jié)一下
一、 錯(cuò)誤描述
基本上的錯(cuò)誤都是以下錯(cuò)誤
1
java.lang.InternalError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.
2
at sun.awt.X11GraphicsEnvironment.initDisplay(Native Method)
3
at sun.awt.X11GraphicsEnvironment.<clinit>(X11GraphicsEnvironment.java:125)
4
at java.lang.Class.forName0(Native Method)
5
at java.lang.Class.forName(Class.java:140)
6
at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:62)
7
at java.awt.Font.initializeFont(Font.java:309)
8
at java.awt.Font.<init>(Font.java:345)
9
at org.jfree.chart.plot.PiePlot.<clinit>(PiePlot.java:186)
10
at org.jfree.chart.ChartFactory.createPieChart3D(ChartFactory.java:416)
錯(cuò)誤原因么,大概就是jvm找不到字體文件

2

3

4

5

6

7

8

9

10

二、問(wèn)題解決:
寫(xiě)一個(gè)測(cè)試系統(tǒng)環(huán)境的小程序
1
public 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
例如輸入結(jié)果:
zh
CN
GB2312
2.4.19-4GB
對(duì)于我們來(lái)說(shuō)關(guān)注的地方其實(shí)只有第一行“zh”,說(shuō)明目前環(huán)境是簡(jiǎn)體中文,
從Sun的文檔"Adding Fonts to the Java Runtime"[參見(jiàn)參考文獻(xiàn)1]中,我們可以得知: 在英文環(huán)境下,字體屬性由無(wú)后綴的font.properties 定義。為了一些操作系統(tǒng)的特殊問(wèn)題,字體屬性文件的名字可以加入操作系統(tǒng)的版本號(hào)作為后綴。例如,Solaris 2.5.1 不支持 TrueType 字體,所以字體屬性文件font.properties.5.5.1 將只包含 F3 字體。在大多數(shù)操作系統(tǒng)中,版本后綴的值由System.getProperty("os.version")來(lái)確定。
如果環(huán)境是日文、韓文、簡(jiǎn)體中文或繁體中文,就必須使用相應(yīng)于特定環(huán)境的 font.properties 文件。這些文件可以通過(guò)文件名后邊加上相應(yīng)的國(guó)家或者locale后綴識(shí)別,格式為font.properties.<locale>。該<locale>實(shí)際上由<language>_<region>_<encoding>三部分構(gòu)成。而<language>、<region>和<encoding>分別對(duì)應(yīng)了系統(tǒng)屬性(由System.getProperty方法返回的字符串)"user.language"、"user.region"和"file.encoding"。而這個(gè)font.properties.<locale>名也可以跟操作系統(tǒng)的版本結(jié)合使用。
概括的講,Java按照以下順序搜索字體屬性文件:
1
font.properties.<language>_<region>_<encoding>.<osVersion>
2
font.properties.<language>_<region>_<encoding>
3
font.properties.<language>_<region>.<osVersion>
4
font.properties.<language>_<region>
5
font.properties.<language>_<encoding>.<osVersion>
6
font.properties.<language>_<encoding>
7
font.properties.<language>_<osVersion>
8
font.properties.<language>
9
font.properties.<encoding>.<osVersion>
10
font.properties.<encoding>
11
font.properties.<osVersion>
12
font.properties
13
所以我們需要檢查%JAVA_HOME%/jre/lib/fonts目錄下是否存在font.properties.zh文件,如果沒(méi)有則新建一個(gè),或者copy font.properties
1
cp font.properties font.properties.zh
三、檢查
很多人介紹的都是copy或引用/usr/share/fonts/zh_CN/TrueType目錄下的中文字體
但是有些suse上不存在/usr/share/fonts這個(gè)目錄,所以有時(shí)候會(huì)叫人感覺(jué)很頭疼,但是仔細(xì)檢查你會(huì)發(fā)現(xiàn)路經(jīng)/usr/lib/X11/font/truetype存在,所以并不一定要/usr/share/fonts/zh_CN/TrueType這個(gè)文件夾
用vi打開(kāi)/usr/lib/X11/font/truetype/fonts.dir文件,
搜索gbk或gb2312(一個(gè)人需要而定),將其中的一個(gè)拷貝出來(lái)此處,我們搜索gb18030,在font.dir中找到
-misc-ZYSong18030-medium-r-normal--0-0-0-0-c-0-iso10646-1
按照 java 的字體規(guī)則改為 -misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
我們選用字體 -misc-ZYSong18030-medium-r-normal--0-0-0-0-c-0-iso10646-1 是因?yàn)樵?redhat 7.3 和 redhat 8.0 上都能用
打開(kāi)font.properties.zh,將里面內(nèi)容替換如下:
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
#
8
serif.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
9
10
serif.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
11
12
serif.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
13
14
serif.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
15
16
sansserif.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
17
18
sansserif.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
19
20
sansserif.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
21
22
sansserif.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
23
24
monospaced.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
25
26
monospaced.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
27
28
monospaced.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
29
30
monospaced.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
31
32
dialog.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
33
34
35
dialog.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
36
37
dialog.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
38
39
dialog.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
40
41
dialoginput.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
42
43
dialoginput.italic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
44
45
dialoginput.bold.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
46
47
dialoginput.bolditalic.0=-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
48
# Missing Glyph Character
49
#
50
default.char=274f
51
52
# Component Font Character Encodings
53
#
54
fontcharset.serif.0=sun.io.CharToByteISO8859_1
55
fontcharset.serif.1=sun.awt.motif.CharToByteX11GBK
56
57
fontcharset.sansserif.0=sun.io.CharToByteISO8859_1
58
fontcharset.sansserif.1=sun.awt.motif.CharToByteX11GBK
59
60
fontcharset.monospaced.0=sun.io.CharToByteISO8859_1
61
fontcharset.monospaced.1=sun.awt.motif.CharToByteX11GBK
62
63
fontcharset.dialog.0=sun.io.CharToByteISO8859_1
64
fontcharset.dialog.1=sun.awt.motif.CharToByteX11GBK
65
66
fontcharset.dialoginput.0=sun.io.CharToByteISO8859_1
67
fontcharset.dialoginput.1=sun.awt.motif.CharToByteX11GBK
68
69
# Exclusion Ranges
70
#
71
72
# XFontSet Information
73
#
74
fontset.serif.plain=\
75
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
76
77
fontset.serif.italic=\
78
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
79
80
fontset.serif.bold=\
81
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
82
83
fontset.serif.bolditalic=\
84
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
85
86
fontset.sansserif.plain=\
87
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
88
89
fontset.sansserif.italic=\
90
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
91
92
fontset.sansserif.bold=\
93
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
94
95
fontset.sansserif.bolditalic=\
96
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
97
98
fontset.monospaced.plain=\
99
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
100
101
fontset.monospaced.italic=\
102
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
103
104
fontset.monospaced.bold=\
105
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
106
107
fontset.monospaced.bolditalic=\
108
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
109
110
fontset.dialog.italic=\
111
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
112
113
fontset.dialog.bold=\
114
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
115
116
fontset.dialog.bolditalic=\
117
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
118
119
fontset.dialog.plain=\
120
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
121
122
fontset.dialoginput.italic=\
123
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
124
125
fontset.dialoginput.bold=\
126
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
127
128
fontset.dialoginput.bolditalic=\
129
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
130
131
fontset.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
138
fontset.default=\
139
-misc-ZYSong18030-medium-r-normal--*-%d-*-*-c-*-iso10646-1
140
141

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

仔細(xì)觀察你可以發(fā)現(xiàn)替換的內(nèi)容基本都是".0"的內(nèi)容
特別要注意
1
# Missing Glyph Character
2
#
3
default.char=274f
4
5
# Component Font Character Encodings
6
#
7
fontcharset.serif.0=sun.io.CharToByteISO8859_1
8
fontcharset.serif.1=sun.awt.motif.CharToByteX11GBK
9
10
fontcharset.sansserif.0=sun.io.CharToByteISO8859_1
11
fontcharset.sansserif.1=sun.awt.motif.CharToByteX11GBK
12
13
fontcharset.monospaced.0=sun.io.CharToByteISO8859_1
14
fontcharset.monospaced.1=sun.awt.motif.CharToByteX11GBK
15
16
fontcharset.dialog.0=sun.io.CharToByteISO8859_1
17
fontcharset.dialog.1=sun.awt.motif.CharToByteX11GBK
18
19
fontcharset.dialoginput.0=sun.io.CharToByteISO8859_1
20
fontcharset.dialoginput.1=sun.awt.motif.CharToByteX11GBK
21
22
# Exclusion Ranges
23
#
24
25
# XFontSet Information
26
#
27
28

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

修改后的詞部分內(nèi)容與原文件內(nèi)容不一致,注意修改此處
最后值得注意的是在font.properties.zh內(nèi)容的結(jié)尾加上
1
appendedfontpath=/usr/lib/X11/fonts/truetype
