当前位置: 技术问答>java相关
请问如何修改java中的默认字体等等!
来源: 互联网 发布时间:2014-12-23
本文导语: | 本文档叙述怎样将亚洲和其它语言字体添加到 Java 运行时 JDK 1.2 中。更明确的说,本文档介绍 JDK 1.2 中用于将这些字体添加到 Java 运行时的特殊功能。在将来的 JDK 版本中,该功能很有可能发生改变。 ...
|
本文档叙述怎样将亚洲和其它语言字体添加到 Java 运行时 JDK 1.2 中。更明确的说,本文档介绍 JDK 1.2 中用于将这些字体添加到 Java 运行时的特殊功能。在将来的 JDK 版本中,该功能很有可能发生改变。
这一次,本文讲述怎样在系统上安装日文、韩文、中文及繁体中文字体。
JDK 1.2 的 Win32 平台版本支持 TrueType 和 Postscript Type1 字体。JDK 1.2 的 Solaris 平台版本支持能由 X11 服务器处理的可缩放轮廓字体,例如 F3、Type1 及 TrueType。
命名 font.properties 文件
JDK 1.2 中捆绑了一些 font.properties 文件。您可以在 Java 安装目录下的 ../lib 目录下找到这些文件。这些文件包含标准字体环境信息。下面的解释假定本文档的读者在英文环境中工作。在英文环境中,缺省 font.properties 文件名没有后缀,如下所示:
font.properties
然而,不同的操作系统安装有不同的字体,所以规定在读字体属性文件时,文件名中应内嵌操作系统版本。例如,Solaris 2.5.1 不支持 TrueType 字体,所以字体属性文件 font.properties.5.5.1 将只包含 F3 字体。因而,我们首先寻找的文件的文件名为:
font.properties.
其中 在大多数系统中是由 System.getProperty("os.version") 返回的版本。在 Windows NT 中,此方法被覆盖,用 NT4.0 代替 4.0 返回,以便区别 NT 和 95。
然而,如果环境是日文、韩文、中文或繁体中文,就必须使用相应于特定环境的 font.properties 文件。这些文件可以通过文件名后面添加的国家或 locale 后缀识别,如下所示:
font.properties.
其中 locale 是下面中的一个:
ja
ko
zh
zh_TW
...
选择带有您感兴趣的特定字体后缀的文件。因此,对繁体中文您就可以访问 font.properties.zh_TW 文件。
注意:该 实际上由 __ 构成,其中
是从 System.getProperty("user.language") 方法返回的字符串
是从 System.getProperty("user.region") 方法返回的字符串
是从 System.getProperty("file.encoding") 方法返回的字符串
这个 font.properties. 名也可以添加操作系统版本。概括地讲,按下列顺序搜索字体属性文件:
font.properties.__.
font.properties.__
font.properties._.
font.properties._
font.properties._.
font.properties._
font.properties._
font.properties.
font.properties..
font.properties.
font.properties.
font.properties
使用 font.properties 文件
您必须使用 font.properties 文件以便为 Java 运行时添加字体。该 font.properties 文件是特定于平台的。它指示特定平台用做 Java 虚拟字体的字体。字体按类型或类分组。当前,Java 运行时支持下列字体类:
Serif
Sans-serif
Monospaced
Dialog
DialogInput
及下列字体样式:
plain
bold
italic
bolditalic
该 font.properties 文件定义用于平台的字体的特定信息。包括别名,例如:
alias.timesroman=serif
alias.helvetica=sansserif
注意: 这是一个不好的例子,因为 timesroman 和 helvetica 是真实的字体名,而在 JDK1.2 中,我们不再使用这些名称作为虚拟字体的别名。
它也包括字体描述。Win32 和 Solaris 平台间的描述是有区别的。必要时,我们的示例使用 serif 字体阐述如何指定和转换字体。然而,同一条目适用于其它字体类型。一般来说,字体属性文件中也有条目指定您想使用的字体。这些条目的格式如下:
.. = ,属性
虚拟字体名是由 Java 运行时所识别的字体名。平台字体名是您平台上所用字体的实际名称。例如,Dialog 和 Serif 是 Java 字体名,而 Times 和 Helvetica 是 Win32 或 Solaris 平台上的本地字体名。索引号指定搜索匹配字形的顺序,0 具有最高的优先级。
JDK1.2 中,虚拟字体名和样式的矩阵必须是完整的。例如,您必须有 serif,serif.bold serif.italic, serif.bolditalic. 需要注意 serif> 与 serif.plain 是等价的。本文件中所有的名字都是不区分大小写的。
例如,在 JDK1.1 中 Solaris 的 font.properties 文件中,serif 条目如下所示:
serif.plain.0=-linotype-times-medium-r-normal--*-%d-*-*-p-*-iso8859-1
serif.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.italic.0=-linotype-times-medium-i-normal--*-%d-*-*-p-*-iso8859-1
serif.bold.0=-linotype-times-bold-r-normal--*-%d-*-*-p-*-iso8859-1
serif.bolditalic.0=-linotype-times-bold-i-normal--*-%d-*-*-p-*-iso8859-1
如您所见,其中仅指定了“serif.plain”、“serif.italic”、“serif.bold”和“serif.bolditalic”的第一个条目。该字体每种样式的第二个和第三个条目都缺省为“serif.1”和“serif.2”(因为每种“serif”字体样式都使用两种相同的字体)。然而,在 JDK 1.2 font.properties 中,必须指定整个矩阵:
serif.0=-linotype-times-medium-r-normal--*-%d-*-*-p-*-iso8859-1
serif.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.italic.0=-linotype-times-medium-i-normal--*-%d-*-*-p-*-iso8859-1
serif.italic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.italic.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bold.0=-linotype-times-bold-r-normal--*-%d-*-*-p-*-iso8859-1
serif.bold.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bold.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bolditalic.0=-linotype-times-bold-i-normal--*-%d-*-*-p-*-iso8859-1
serif.bolditalic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bolditalic.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
如前所述,尽管不需要指定 plain 样式的关键值 plain(serif.0 缺省使用 plain 风格),然而必须为这些样式指定 italic、bold 或 bolditalic。
将亚洲字体添加到 Java 运行时
在英文环境平台上使用亚洲字体的日文须执行两个步骤。
步骤 1: 安装字体
首先,必须在系统中安装日文、韩文、中文或繁体中文字体。对于 Windows 平台用户,Microsoft 随 NT4.0 安装 CD 一起免费发放这些亚洲字体。您也可以从 Microsoft 主页下载这些字体。Solaris 用户必须与 SunSoft 联系以便为 Solaris 环境申请亚洲轮廓字体。
步骤 2: 复制字体
在系统中安装了字体后,将您感兴趣的字体描述复制到 font.properties 中。添加一种亚洲字体最简单的办法是将 font.properties. 文件重命名为新的 font.properties 文件。locale 符号代表您所感兴趣的字体名。用 font.properties. 替换 font.properties 时不需要编辑。因为 font.properties. 是 font.properties 的一个超集。下面是指定不同字体属性文件的 locale 符号:
字体的 Locale 符号
字体名 font.properties 符号
日文 ja
韩文 ko
中文 zh
繁体中文 zh_TW
这样,要使用韩文字体,您可以复制或将 font.properties.ko 重命名为 font.properties。
运行时使用多种字体
运行时可以使用一种以上的亚洲字体。为此,您必须编辑 font.properties 文件。本节叙述使用多种字体时,您要对文件所做的编辑。
指定 Win32 平台上的字体
在英文 Win32 平台上有三种缺省 serif 字体可供使用。这些字体是:
Arial
WingDings
Symbol
此外,font.properties 文件中对这些 serif 字体的描述如下:
serif.0=Arial,ANSI_CHARSET
serif.1=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
serif.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED
这三行一起指示本平台中可供使用的三种 serif 字体的索引。每行指示一种 serif 字体,随后是这种字体的索引。
出现在单词 serif 之后的数字(0、1 和 2),如 serif.0,指示与 Unicode 或 Java 字符串编码的 codepoint 相匹配的字形的搜索顺序。这样,如果 serif.0 和 serif.1 都有相应于同一 Unicode codepoint 的字形,那么将使用 serif.0 的字形。
第一个参数是 Win32 本地字体的字样名。每一行命名一种特定的字体。例如,用于 serif.0 的一行命名 Arial 字体,而用于 serif.2 的一行命名 Symbol 字体。
第二个参数的形式为 *_CHARSET。在我们的示例中,它的形式为 ANSI_CHARSET 或 SYMBOL_CHARSET。这个参数指示与 Win32 字体相对应的字符集条目。(详细信息请参阅 Win32 API 文档。)
如果出现第三个参数,则为 NEED_CONVERTED。这个参数指示相应的平台字体不能使用 Unicode 访问。这个参数出现时,试图使用该字体的字形前,Java 运行时需要将 Unicode 字符串转换为这种字体的索引。具有这个 NEED_CONVERTED 参数的字体必须有相应的字体字符集条目,指示用于转换 Unicode 字符串的字符集转换器。
在我们的示例中,serif.1 和 serif.2 都有 NEED_CONVERTED 参数。两者在 font.properties 文件中都有字体字符集条目,如下所示:
fontcharset.serif.1=sun.awt.windows.CharToByteWingDings
fontcharset.serif.2=sun.awt.CharToByteSymbol
用于 serif.1 的字体字符集条目指示,如果要绘制 WingDings 字形,应该使用 sun.awt.windows.CharToByteWingDings 转换器转换 Unicode 字符串。(请记住 font.properties 文件已经为 serif.1 建立了字体 WingDings。)
字符集转换器的规范随后在字符集转换器一节中叙述。
注意:在 JDK1.2 的当前实现中未使用 NEED_CONVERTED。
JDK1.2 中的字体文件名
为缩短初始化时间,现在有一种方法指定逻辑字体名和物理字体名间的映射。例如:
filename.Arial=ARIAL.TTF
filename.Arial_Bold=ARIALBD.TTF
filename.Arial_Italic=ARIALI.TTF
filename.Arial_Bold_Italic=ARIALBI.TTF
第一个条目显示字体名 Arial 和物理字体名 ARIAL.TTF 之间的映射。下一个条目显示 Arial 所使用的不同样式间的映射。由于不需要打开每个字体文件去查找特定名称的字体,所以缩短了初始化时间。
Win32 字体文件
当前的 Win32 JDK 构建提供下列字体属性文件:
./lib/font.properties
./lib/font.properties.ar
./lib/font.properties.iw
./lib/font.properties.ja
./lib/font.properties.ko
./lib/font.properties.ru
./lib/font.properties.th
./lib/font.properties.zh
./lib/font.properties.zh.NT4.0
./lib/font.properties.zh_TW
如果您需要其它字体,则必须创建自己的字体属性文件。
指定 Solaris 平台的字体
在 JDK 1.2 中,font.properties 文件中指定的字体应引用可缩放字体。然而这并不是说在需要某一字体大小时总是使用可缩放字体。X11 中工作的方式是给定 xlfd 字符串,例如
-adobe-courier-bold-o-normal--10-100-75-75-m-60-iso8859-1
Xserver 将首先查找与 xlfd 字符串中的条目相匹配的可缩放字体(用于字体铸型、字体系列、样式、倾斜、编码等)。然而,它接下来将为指定的像素/点大小(本例中为 10 pt)继续查找与这个 xlfd 字符串完全匹配的位图字体。如果找到一个,那么 X11 将返回从使用的位图字体文件直接读取的位图,而不是可缩放字体文件中的数据生成的位图。
例如,英文 Solaris (2.6+)中的 serif 字体包含下列字体:
serif.0=-monotype-times new roman-regular-r---*-%d-*-*-p-*-iso8859-1
serif.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol
serif.italic.0=-monotype-times new roman-regular-i---*-%d-*-*-p-*-iso8859-1
serif.italic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.italic.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol
serif.bold.0=-monotype-times new roman-bold-r---*-%d-*-*-p-*-iso8859-1
serif.bold.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bold.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol
serif.bolditalic.0=-monotype-times new roman-bold-i---*-%d-*-*-p-*-iso8859-1
serif.bolditalic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bolditalic.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol
Solaris font.properties 文件的这些行指明具有不同样式的 serif 字体的索引。例如,字样名为 serif 并且样式为 plain 的字体由 serif.0、serif.1 和 serif.2 组成。此外,这些行指明有斜体样式的 serif 字体由 serif.italic.0、serif.italic.1 和 serif.italic.2 组成。
当前,Solaris (X11) 字体的索引不是 Unicode 索引。由于它不是 Unicode,所以字体总是需要转换。每个条目都有其相应的字体字符集条目指明应该怎样进行转换,如下所示:
fontcharset.serif.0=sun.io.CharToByte8859_1
fontcharset.serif.1=sun.awt.motif.CharToByteX11Dingbats
fontcharset.serif.2=sun.awt.CharToByteSymbol
例如,下面一行:
fontcharset.serif.0=sun.io.CharToByte8859_1
指明所有的 serif.0 字体,无论类型是 plain (serif.plain.0),bold (serif.bold.0),italics (serif.italic.0),还是 bold 和 italics (serif.bolditalic.0),都将使用 sun.io.CharToByte8859_1 转换器进行转换。
测试并校正 font.properties 文件中的 xlfd 字符串
无论如何应指定可缩放字体的原因是因为 Java2D 只能对可缩放字体执行一些特定的操作,例如生成轮廓。现在 Java2D 代码可识别可缩放字体,例如 TrueType、Type1 或 F3。因此,在 font.properties 文件中输入 xlfd 字符串时,应查找系统上安装的这些字体并指定它们。通常 TrueType 字体的文件扩展名为“ttf”。Type 1 字体的文件扩展名为“pfa”或“pfb”。F3 字体的文件扩展名为“f3b”。对于Solaris 2.6 的“C”locale,在所有包都安装后,您可以在以下位置找到这些格式的字体:
Type1: /usr/openwin/lib/X11/fonts/Type1
TrueType: /usr/openwin/lib/X11/fonts/TrueType
F3: /usr/openwin/lib/X11/fonts/F3
在其它的 locale 中,字体将安装在类似于 /usr/openwin/lib/locale/ 的目录中。例如,在 JA locale 中,字体将安装在 /usr/openwin/lib/locale/ja 目录下:
TrueType: /usr/openwin/lib/locale/ja/X11/fonts/TT
F3: /usr/openwin/lib/locale/ja/X11/fonts/F3
随 locale 不同,字体文件的位置也可能不同(也就是说不一定总是在 /usr/openwin/lib/locale//X11/fonts 中),但通常在 /usr/openwin/lib/locale/ 目录的某处。
一旦定位了可缩放字体的位置,请在存放可缩放字体文件的目录中查看“fonts.dir”文件。这个文件列出了该目录中字体的所有有效的 xlfd 字符串。例如,在位于 /usr/openwin/lib/locale/ja/X11/fonts/TT 目录中的“fonts.dir”文件中,有这样一个条目:
HG-MinchoL.ttf -ricoh-hg mincho l-medium-r-normal--0-0-0-0-m-0-jisx0208.1983-0
在 xlfd 字符串中,您将见到 4 个连续的零值。它们指明像素大小、点大小和分辨率的 x、y 值。当将这个 xlfd 字符串复制为 font.properties 条目时,记住要用“%d”替换点大小(第二个“0”),当使用该字体时,它将由特定的点大小代替。同样,用“*”(星号)替换另一个“0”,说明任何值都可匹配这个域。举个例子,如果上面的字体被用作 font.properties 文件中指定的“serif”字体的条目,那么它将类似:
serif.1=-ricoh-hg mincho l-medium-r-normal--*-%d-*-*-m-*-jisx0208.1983-0
当实际使用字体时,使用 Java “字体”对象创建时指定的点大小(用这个值替换“%d”),并且用这个点大小初始化字体以备后用。
校验您所录入 font.properties 文件的 xlfd 字符串正确性的一种方法是用“xfd”显示那种字体。“xfd”是位于 /usr/openwin/bin 中显示一种字体的所有字符的 X11 应用程序。要运行此应用程序,请指定字体(以 xlfd 字符串的形式)。要验证 font.properties 文件中的 xlfd 条目,请用有效点大小如 120(12 pt)、140(14 pt)、160(16 pt)等替换“%d”,(xlfd 点大小是“像素大小”的十倍,而像素大小一般被当作字体点大小)。所以,在上面的例子中,“serif.1”条目用于日文 font.properties 文件,要验证这个 xlfd 字符串是否正确,请运行:
% xfd -fn "-ricoh-hg mincho l-medium-r-normal--*-140-*-*-m-*-jisx0208.1983-0"
如果 xlfd 字符串是不正确的,“xfd”将不显示窗口,而且会立刻退出,并显示如下的错误信息:
Warning: Cannot convert string "" to type FontStruct
xfd: no font to display
如果 xlfd 字符串是正确的,将显示一个窗口,窗口中是字体中指定的所有字符。如果超过 256 个字符,则只显示前面 256 个字符,但用户可以通过点击应用程序中显示的“NextPage”按钮浏览所有条目。
可缩放字体说明
记住 font.properties 文件中指定的字体必须是上面提到过的格式中的一种(TrueType、Type1 或 F3)。如果系统中安装的字体都不是这些格式,那么 Java2D 不会找到任何有效字体,所以诸如 drawString ("some Text") 的操作将无法工作。
当前 JDK1.2 中还有 bug,即无法旋转(或缩放或剪切)F3 字体。所以如果存在 TrueType 就应尽量选择 TrueType 字体,而不是 F3 字体。X 服务器对于 Type1 字体也存在 bug(2.5.1 比 2.6 存在更多问题),所以也应尽量避免使用 Type1 字体。
Solaris 字体文件
当前 Solaris JDK 提供下列字体属性文件:
./lib/font.properties
./lib/font.properties.5.6
./lib/font.properties.5.7
./lib/font.properties.cs
./lib/font.properties.el
./lib/font.properties.hu
./lib/font.properties.ja
./lib/font.properties.ja.5.6
./lib/font.properties.ko
./lib/font.properties.ko.5.6
./lib/font.properties.ko.5.7
./lib/font.properties.lt
./lib/font.properties.lv
./lib/font.properties.pl
./lib/font.properties.ru
./lib/font.properties.tr
./lib/font.properties.zh_EUC_CN
./lib/font.properties.zh_EUC_CN.5.6
./lib/font.properties.zh_EUC_CN.5.7
./lib/font.properties.zh_TW_Big5
./lib/font.properties.zh_EUC_TW
./lib/psfont.properties.ja
如果您还需要其它字体,则必须创建自己的字体属性文件。
排除范围
如前所述,虚拟字体名后面的数字指明查找所需字形时搜索实际字体的顺序。有时组成虚拟字体的物理字体有字形上的重叠范围。可以添加排除范围以限制在物理字体中搜索字形的范围。
例如,下面是 Solaris font.properties.ja 文件中对一种等宽字体的描述:
monospaced.plain.0=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0201.1976-0
monospaced.plain.1=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0208.1983-0
monospaced.plain.2=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0201.1976-0
monospaced.plain.3=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
monospaced.plain.4=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
相应的排除范围如下:
exclusion.monospaced.0=0080-ffff
这样就从虚拟字体中的第一种字体中排除了 Unicode 0x0080 到 Unicode 0xffff 范围内的字形,因此将搜索后面的字体(monospaced.plain.1、monospaced.plain.2、monospaced.plain.3、monospaced.plain.4)以查找这些字形。
字符集转换器
该 charset 转换器将 Unicode 或 Java 字符串编码转换为字体索引。字体绘制时,JDK 1.1 运行时使用 charset 转换器,它是 sun.io.CharToByteConverter 的一个子类。
在 JDK 1.1 运行时中添加自己的字体时,需要创建一个 charset 转换器并在 font.properties 文件中指定它。
下面的例子描述如何将您自己的字体添加到 Java serif 字体中。在这个例子中,字体包含 256 种字形,从 0 至 0xff 进行索引。您的字体的字形对应于 Unicode 0xe000 - 0xe0ff。该示例分成两步。第一步,创建您自己的 fontcharset 转换器类。第二步,在 font.properties file 文件中指定您自己的字体名及转换器类名。
步骤 1. 创建字体字符集转换器
这是创建 fontcharset 转换器的 Java 代码。
package mypkg.converter;
import sun.io.CharToByte8859_1;
import sun.io.CharToByteConverter;
import sun.io.ConversionBufferFullException;
public class CharToByteMyFont extends sun.io.CharToByte8859_1 {
/*
* 此方法指示该字体的涵盖范围。
*/
public boolean canConvert(char ch) {
if (ch >= 0xe000 && ch
这一次,本文讲述怎样在系统上安装日文、韩文、中文及繁体中文字体。
JDK 1.2 的 Win32 平台版本支持 TrueType 和 Postscript Type1 字体。JDK 1.2 的 Solaris 平台版本支持能由 X11 服务器处理的可缩放轮廓字体,例如 F3、Type1 及 TrueType。
命名 font.properties 文件
JDK 1.2 中捆绑了一些 font.properties 文件。您可以在 Java 安装目录下的 ../lib 目录下找到这些文件。这些文件包含标准字体环境信息。下面的解释假定本文档的读者在英文环境中工作。在英文环境中,缺省 font.properties 文件名没有后缀,如下所示:
font.properties
然而,不同的操作系统安装有不同的字体,所以规定在读字体属性文件时,文件名中应内嵌操作系统版本。例如,Solaris 2.5.1 不支持 TrueType 字体,所以字体属性文件 font.properties.5.5.1 将只包含 F3 字体。因而,我们首先寻找的文件的文件名为:
font.properties.
其中 在大多数系统中是由 System.getProperty("os.version") 返回的版本。在 Windows NT 中,此方法被覆盖,用 NT4.0 代替 4.0 返回,以便区别 NT 和 95。
然而,如果环境是日文、韩文、中文或繁体中文,就必须使用相应于特定环境的 font.properties 文件。这些文件可以通过文件名后面添加的国家或 locale 后缀识别,如下所示:
font.properties.
其中 locale 是下面中的一个:
ja
ko
zh
zh_TW
...
选择带有您感兴趣的特定字体后缀的文件。因此,对繁体中文您就可以访问 font.properties.zh_TW 文件。
注意:该 实际上由 __ 构成,其中
是从 System.getProperty("user.language") 方法返回的字符串
是从 System.getProperty("user.region") 方法返回的字符串
是从 System.getProperty("file.encoding") 方法返回的字符串
这个 font.properties. 名也可以添加操作系统版本。概括地讲,按下列顺序搜索字体属性文件:
font.properties.__.
font.properties.__
font.properties._.
font.properties._
font.properties._.
font.properties._
font.properties._
font.properties.
font.properties..
font.properties.
font.properties.
font.properties
使用 font.properties 文件
您必须使用 font.properties 文件以便为 Java 运行时添加字体。该 font.properties 文件是特定于平台的。它指示特定平台用做 Java 虚拟字体的字体。字体按类型或类分组。当前,Java 运行时支持下列字体类:
Serif
Sans-serif
Monospaced
Dialog
DialogInput
及下列字体样式:
plain
bold
italic
bolditalic
该 font.properties 文件定义用于平台的字体的特定信息。包括别名,例如:
alias.timesroman=serif
alias.helvetica=sansserif
注意: 这是一个不好的例子,因为 timesroman 和 helvetica 是真实的字体名,而在 JDK1.2 中,我们不再使用这些名称作为虚拟字体的别名。
它也包括字体描述。Win32 和 Solaris 平台间的描述是有区别的。必要时,我们的示例使用 serif 字体阐述如何指定和转换字体。然而,同一条目适用于其它字体类型。一般来说,字体属性文件中也有条目指定您想使用的字体。这些条目的格式如下:
.. = ,属性
虚拟字体名是由 Java 运行时所识别的字体名。平台字体名是您平台上所用字体的实际名称。例如,Dialog 和 Serif 是 Java 字体名,而 Times 和 Helvetica 是 Win32 或 Solaris 平台上的本地字体名。索引号指定搜索匹配字形的顺序,0 具有最高的优先级。
JDK1.2 中,虚拟字体名和样式的矩阵必须是完整的。例如,您必须有 serif,serif.bold serif.italic, serif.bolditalic. 需要注意 serif> 与 serif.plain 是等价的。本文件中所有的名字都是不区分大小写的。
例如,在 JDK1.1 中 Solaris 的 font.properties 文件中,serif 条目如下所示:
serif.plain.0=-linotype-times-medium-r-normal--*-%d-*-*-p-*-iso8859-1
serif.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.italic.0=-linotype-times-medium-i-normal--*-%d-*-*-p-*-iso8859-1
serif.bold.0=-linotype-times-bold-r-normal--*-%d-*-*-p-*-iso8859-1
serif.bolditalic.0=-linotype-times-bold-i-normal--*-%d-*-*-p-*-iso8859-1
如您所见,其中仅指定了“serif.plain”、“serif.italic”、“serif.bold”和“serif.bolditalic”的第一个条目。该字体每种样式的第二个和第三个条目都缺省为“serif.1”和“serif.2”(因为每种“serif”字体样式都使用两种相同的字体)。然而,在 JDK 1.2 font.properties 中,必须指定整个矩阵:
serif.0=-linotype-times-medium-r-normal--*-%d-*-*-p-*-iso8859-1
serif.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.italic.0=-linotype-times-medium-i-normal--*-%d-*-*-p-*-iso8859-1
serif.italic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.italic.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bold.0=-linotype-times-bold-r-normal--*-%d-*-*-p-*-iso8859-1
serif.bold.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bold.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bolditalic.0=-linotype-times-bold-i-normal--*-%d-*-*-p-*-iso8859-1
serif.bolditalic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bolditalic.2=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
如前所述,尽管不需要指定 plain 样式的关键值 plain(serif.0 缺省使用 plain 风格),然而必须为这些样式指定 italic、bold 或 bolditalic。
将亚洲字体添加到 Java 运行时
在英文环境平台上使用亚洲字体的日文须执行两个步骤。
步骤 1: 安装字体
首先,必须在系统中安装日文、韩文、中文或繁体中文字体。对于 Windows 平台用户,Microsoft 随 NT4.0 安装 CD 一起免费发放这些亚洲字体。您也可以从 Microsoft 主页下载这些字体。Solaris 用户必须与 SunSoft 联系以便为 Solaris 环境申请亚洲轮廓字体。
步骤 2: 复制字体
在系统中安装了字体后,将您感兴趣的字体描述复制到 font.properties 中。添加一种亚洲字体最简单的办法是将 font.properties. 文件重命名为新的 font.properties 文件。locale 符号代表您所感兴趣的字体名。用 font.properties. 替换 font.properties 时不需要编辑。因为 font.properties. 是 font.properties 的一个超集。下面是指定不同字体属性文件的 locale 符号:
字体的 Locale 符号
字体名 font.properties 符号
日文 ja
韩文 ko
中文 zh
繁体中文 zh_TW
这样,要使用韩文字体,您可以复制或将 font.properties.ko 重命名为 font.properties。
运行时使用多种字体
运行时可以使用一种以上的亚洲字体。为此,您必须编辑 font.properties 文件。本节叙述使用多种字体时,您要对文件所做的编辑。
指定 Win32 平台上的字体
在英文 Win32 平台上有三种缺省 serif 字体可供使用。这些字体是:
Arial
WingDings
Symbol
此外,font.properties 文件中对这些 serif 字体的描述如下:
serif.0=Arial,ANSI_CHARSET
serif.1=WingDings,SYMBOL_CHARSET,NEED_CONVERTED
serif.2=Symbol,SYMBOL_CHARSET,NEED_CONVERTED
这三行一起指示本平台中可供使用的三种 serif 字体的索引。每行指示一种 serif 字体,随后是这种字体的索引。
出现在单词 serif 之后的数字(0、1 和 2),如 serif.0,指示与 Unicode 或 Java 字符串编码的 codepoint 相匹配的字形的搜索顺序。这样,如果 serif.0 和 serif.1 都有相应于同一 Unicode codepoint 的字形,那么将使用 serif.0 的字形。
第一个参数是 Win32 本地字体的字样名。每一行命名一种特定的字体。例如,用于 serif.0 的一行命名 Arial 字体,而用于 serif.2 的一行命名 Symbol 字体。
第二个参数的形式为 *_CHARSET。在我们的示例中,它的形式为 ANSI_CHARSET 或 SYMBOL_CHARSET。这个参数指示与 Win32 字体相对应的字符集条目。(详细信息请参阅 Win32 API 文档。)
如果出现第三个参数,则为 NEED_CONVERTED。这个参数指示相应的平台字体不能使用 Unicode 访问。这个参数出现时,试图使用该字体的字形前,Java 运行时需要将 Unicode 字符串转换为这种字体的索引。具有这个 NEED_CONVERTED 参数的字体必须有相应的字体字符集条目,指示用于转换 Unicode 字符串的字符集转换器。
在我们的示例中,serif.1 和 serif.2 都有 NEED_CONVERTED 参数。两者在 font.properties 文件中都有字体字符集条目,如下所示:
fontcharset.serif.1=sun.awt.windows.CharToByteWingDings
fontcharset.serif.2=sun.awt.CharToByteSymbol
用于 serif.1 的字体字符集条目指示,如果要绘制 WingDings 字形,应该使用 sun.awt.windows.CharToByteWingDings 转换器转换 Unicode 字符串。(请记住 font.properties 文件已经为 serif.1 建立了字体 WingDings。)
字符集转换器的规范随后在字符集转换器一节中叙述。
注意:在 JDK1.2 的当前实现中未使用 NEED_CONVERTED。
JDK1.2 中的字体文件名
为缩短初始化时间,现在有一种方法指定逻辑字体名和物理字体名间的映射。例如:
filename.Arial=ARIAL.TTF
filename.Arial_Bold=ARIALBD.TTF
filename.Arial_Italic=ARIALI.TTF
filename.Arial_Bold_Italic=ARIALBI.TTF
第一个条目显示字体名 Arial 和物理字体名 ARIAL.TTF 之间的映射。下一个条目显示 Arial 所使用的不同样式间的映射。由于不需要打开每个字体文件去查找特定名称的字体,所以缩短了初始化时间。
Win32 字体文件
当前的 Win32 JDK 构建提供下列字体属性文件:
./lib/font.properties
./lib/font.properties.ar
./lib/font.properties.iw
./lib/font.properties.ja
./lib/font.properties.ko
./lib/font.properties.ru
./lib/font.properties.th
./lib/font.properties.zh
./lib/font.properties.zh.NT4.0
./lib/font.properties.zh_TW
如果您需要其它字体,则必须创建自己的字体属性文件。
指定 Solaris 平台的字体
在 JDK 1.2 中,font.properties 文件中指定的字体应引用可缩放字体。然而这并不是说在需要某一字体大小时总是使用可缩放字体。X11 中工作的方式是给定 xlfd 字符串,例如
-adobe-courier-bold-o-normal--10-100-75-75-m-60-iso8859-1
Xserver 将首先查找与 xlfd 字符串中的条目相匹配的可缩放字体(用于字体铸型、字体系列、样式、倾斜、编码等)。然而,它接下来将为指定的像素/点大小(本例中为 10 pt)继续查找与这个 xlfd 字符串完全匹配的位图字体。如果找到一个,那么 X11 将返回从使用的位图字体文件直接读取的位图,而不是可缩放字体文件中的数据生成的位图。
例如,英文 Solaris (2.6+)中的 serif 字体包含下列字体:
serif.0=-monotype-times new roman-regular-r---*-%d-*-*-p-*-iso8859-1
serif.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol
serif.italic.0=-monotype-times new roman-regular-i---*-%d-*-*-p-*-iso8859-1
serif.italic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.italic.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol
serif.bold.0=-monotype-times new roman-bold-r---*-%d-*-*-p-*-iso8859-1
serif.bold.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bold.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol
serif.bolditalic.0=-monotype-times new roman-bold-i---*-%d-*-*-p-*-iso8859-1
serif.bolditalic.1=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
serif.bolditalic.2=-*-symbol-medium-r-normal-*-*-%d-*-*-p-*-adobe-symbol
Solaris font.properties 文件的这些行指明具有不同样式的 serif 字体的索引。例如,字样名为 serif 并且样式为 plain 的字体由 serif.0、serif.1 和 serif.2 组成。此外,这些行指明有斜体样式的 serif 字体由 serif.italic.0、serif.italic.1 和 serif.italic.2 组成。
当前,Solaris (X11) 字体的索引不是 Unicode 索引。由于它不是 Unicode,所以字体总是需要转换。每个条目都有其相应的字体字符集条目指明应该怎样进行转换,如下所示:
fontcharset.serif.0=sun.io.CharToByte8859_1
fontcharset.serif.1=sun.awt.motif.CharToByteX11Dingbats
fontcharset.serif.2=sun.awt.CharToByteSymbol
例如,下面一行:
fontcharset.serif.0=sun.io.CharToByte8859_1
指明所有的 serif.0 字体,无论类型是 plain (serif.plain.0),bold (serif.bold.0),italics (serif.italic.0),还是 bold 和 italics (serif.bolditalic.0),都将使用 sun.io.CharToByte8859_1 转换器进行转换。
测试并校正 font.properties 文件中的 xlfd 字符串
无论如何应指定可缩放字体的原因是因为 Java2D 只能对可缩放字体执行一些特定的操作,例如生成轮廓。现在 Java2D 代码可识别可缩放字体,例如 TrueType、Type1 或 F3。因此,在 font.properties 文件中输入 xlfd 字符串时,应查找系统上安装的这些字体并指定它们。通常 TrueType 字体的文件扩展名为“ttf”。Type 1 字体的文件扩展名为“pfa”或“pfb”。F3 字体的文件扩展名为“f3b”。对于Solaris 2.6 的“C”locale,在所有包都安装后,您可以在以下位置找到这些格式的字体:
Type1: /usr/openwin/lib/X11/fonts/Type1
TrueType: /usr/openwin/lib/X11/fonts/TrueType
F3: /usr/openwin/lib/X11/fonts/F3
在其它的 locale 中,字体将安装在类似于 /usr/openwin/lib/locale/ 的目录中。例如,在 JA locale 中,字体将安装在 /usr/openwin/lib/locale/ja 目录下:
TrueType: /usr/openwin/lib/locale/ja/X11/fonts/TT
F3: /usr/openwin/lib/locale/ja/X11/fonts/F3
随 locale 不同,字体文件的位置也可能不同(也就是说不一定总是在 /usr/openwin/lib/locale//X11/fonts 中),但通常在 /usr/openwin/lib/locale/ 目录的某处。
一旦定位了可缩放字体的位置,请在存放可缩放字体文件的目录中查看“fonts.dir”文件。这个文件列出了该目录中字体的所有有效的 xlfd 字符串。例如,在位于 /usr/openwin/lib/locale/ja/X11/fonts/TT 目录中的“fonts.dir”文件中,有这样一个条目:
HG-MinchoL.ttf -ricoh-hg mincho l-medium-r-normal--0-0-0-0-m-0-jisx0208.1983-0
在 xlfd 字符串中,您将见到 4 个连续的零值。它们指明像素大小、点大小和分辨率的 x、y 值。当将这个 xlfd 字符串复制为 font.properties 条目时,记住要用“%d”替换点大小(第二个“0”),当使用该字体时,它将由特定的点大小代替。同样,用“*”(星号)替换另一个“0”,说明任何值都可匹配这个域。举个例子,如果上面的字体被用作 font.properties 文件中指定的“serif”字体的条目,那么它将类似:
serif.1=-ricoh-hg mincho l-medium-r-normal--*-%d-*-*-m-*-jisx0208.1983-0
当实际使用字体时,使用 Java “字体”对象创建时指定的点大小(用这个值替换“%d”),并且用这个点大小初始化字体以备后用。
校验您所录入 font.properties 文件的 xlfd 字符串正确性的一种方法是用“xfd”显示那种字体。“xfd”是位于 /usr/openwin/bin 中显示一种字体的所有字符的 X11 应用程序。要运行此应用程序,请指定字体(以 xlfd 字符串的形式)。要验证 font.properties 文件中的 xlfd 条目,请用有效点大小如 120(12 pt)、140(14 pt)、160(16 pt)等替换“%d”,(xlfd 点大小是“像素大小”的十倍,而像素大小一般被当作字体点大小)。所以,在上面的例子中,“serif.1”条目用于日文 font.properties 文件,要验证这个 xlfd 字符串是否正确,请运行:
% xfd -fn "-ricoh-hg mincho l-medium-r-normal--*-140-*-*-m-*-jisx0208.1983-0"
如果 xlfd 字符串是不正确的,“xfd”将不显示窗口,而且会立刻退出,并显示如下的错误信息:
Warning: Cannot convert string "" to type FontStruct
xfd: no font to display
如果 xlfd 字符串是正确的,将显示一个窗口,窗口中是字体中指定的所有字符。如果超过 256 个字符,则只显示前面 256 个字符,但用户可以通过点击应用程序中显示的“NextPage”按钮浏览所有条目。
可缩放字体说明
记住 font.properties 文件中指定的字体必须是上面提到过的格式中的一种(TrueType、Type1 或 F3)。如果系统中安装的字体都不是这些格式,那么 Java2D 不会找到任何有效字体,所以诸如 drawString ("some Text") 的操作将无法工作。
当前 JDK1.2 中还有 bug,即无法旋转(或缩放或剪切)F3 字体。所以如果存在 TrueType 就应尽量选择 TrueType 字体,而不是 F3 字体。X 服务器对于 Type1 字体也存在 bug(2.5.1 比 2.6 存在更多问题),所以也应尽量避免使用 Type1 字体。
Solaris 字体文件
当前 Solaris JDK 提供下列字体属性文件:
./lib/font.properties
./lib/font.properties.5.6
./lib/font.properties.5.7
./lib/font.properties.cs
./lib/font.properties.el
./lib/font.properties.hu
./lib/font.properties.ja
./lib/font.properties.ja.5.6
./lib/font.properties.ko
./lib/font.properties.ko.5.6
./lib/font.properties.ko.5.7
./lib/font.properties.lt
./lib/font.properties.lv
./lib/font.properties.pl
./lib/font.properties.ru
./lib/font.properties.tr
./lib/font.properties.zh_EUC_CN
./lib/font.properties.zh_EUC_CN.5.6
./lib/font.properties.zh_EUC_CN.5.7
./lib/font.properties.zh_TW_Big5
./lib/font.properties.zh_EUC_TW
./lib/psfont.properties.ja
如果您还需要其它字体,则必须创建自己的字体属性文件。
排除范围
如前所述,虚拟字体名后面的数字指明查找所需字形时搜索实际字体的顺序。有时组成虚拟字体的物理字体有字形上的重叠范围。可以添加排除范围以限制在物理字体中搜索字形的范围。
例如,下面是 Solaris font.properties.ja 文件中对一种等宽字体的描述:
monospaced.plain.0=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0201.1976-0
monospaced.plain.1=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0208.1983-0
monospaced.plain.2=-morisawa-gothic medium bbb-medium-r-normal-sans-*-%d-*-*-m-*-jisx0201.1976-0
monospaced.plain.3=-urw-itc zapfdingbats-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
monospaced.plain.4=--symbol-medium-r-normal--*-%d-*-*-p-*-sun-fontspecific
相应的排除范围如下:
exclusion.monospaced.0=0080-ffff
这样就从虚拟字体中的第一种字体中排除了 Unicode 0x0080 到 Unicode 0xffff 范围内的字形,因此将搜索后面的字体(monospaced.plain.1、monospaced.plain.2、monospaced.plain.3、monospaced.plain.4)以查找这些字形。
字符集转换器
该 charset 转换器将 Unicode 或 Java 字符串编码转换为字体索引。字体绘制时,JDK 1.1 运行时使用 charset 转换器,它是 sun.io.CharToByteConverter 的一个子类。
在 JDK 1.1 运行时中添加自己的字体时,需要创建一个 charset 转换器并在 font.properties 文件中指定它。
下面的例子描述如何将您自己的字体添加到 Java serif 字体中。在这个例子中,字体包含 256 种字形,从 0 至 0xff 进行索引。您的字体的字形对应于 Unicode 0xe000 - 0xe0ff。该示例分成两步。第一步,创建您自己的 fontcharset 转换器类。第二步,在 font.properties file 文件中指定您自己的字体名及转换器类名。
步骤 1. 创建字体字符集转换器
这是创建 fontcharset 转换器的 Java 代码。
package mypkg.converter;
import sun.io.CharToByte8859_1;
import sun.io.CharToByteConverter;
import sun.io.ConversionBufferFullException;
public class CharToByteMyFont extends sun.io.CharToByte8859_1 {
/*
* 此方法指示该字体的涵盖范围。
*/
public boolean canConvert(char ch) {
if (ch >= 0xe000 && ch