文档

Java™ 教程
隐藏目录
物理字体和逻辑字体
教程:2D图形
课程:使用文本API

物理字体和逻辑字体

有两种类型的字体:物理字体和逻辑字体。物理字体是实际的字体库,包括TrueType或PostScript Type 1字体。物理字体可以是Time,Helvetica,Courier或任何其他字体,包括国际字体。逻辑字体是以下五个字体系列:Serif,SansSerif,Monospaced,Dialog和DialogInput。这些逻辑字体不是实际的字体库。相反,Java运行时环境将逻辑字体名称映射到物理字体。

本节帮助您确定在应用程序中使用哪种类型的字体。它涵盖以下主题:

物理字体

物理字体是实际的字体库,包含字形数据和表格,用于通过字节序列到字形序列的映射,使用TrueType或PostScript Type 1等字体技术。要获取系统中安装的所有可用字体系列的名称,请调用以下方法:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String []fontFamilies = ge.getAvailableFontFamilyNames();

FontSelector示例程序(在FontSelector.java中提供)说明了如何定位和选择这些字体。


注意: 应用程序不应假设任何特定的物理字体存在。但是,逻辑字体是一个安全的选择,因为它们始终存在。有关更多信息,请参见逻辑字体


注意:  如果您看不到applet运行,请安装至少Java SE Development Kit (JDK) 7版本。

Lucidia字体

Oracle的JRE包含此系列物理字体,也可以在Java平台的其他实现中使用许可。这些字体是物理字体,但不依赖于主机操作系统。

使用这些字体的应用程序在这些字体可用的地方可以实现相同的外观。此外,这些字体涵盖了大量的语言(特别是欧洲和中东语言),因此您可以为支持的语言创建完全多语言的应用程序。然而,这些字体可能在所有JRE中都不可用。此外,它们目前不支持完整的Unicode字符集;特别是不支持中文、日文和韩文。

将物理字体与应用程序捆绑

有时,一个应用程序不能依赖于系统上安装的字体,通常是因为字体是一种自定义字体,否则不可用。在这种情况下,您必须将字体文件与应用程序捆绑在一起。

使用以下方法之一从现有的物理字体创建Font对象:

Font java.awt.Font.createFont(int fontFormat, InputStream in);
Font java.awt.Font.createFont(int fontFormat, File fontFile);

要从TrueType字体创建Font对象,形式参数fontFormat必须是常量Font.TRUETYPE_FONT。以下示例从TrueType字体文件A.ttf创建Font对象:

Font font = Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf"));

直接从文件访问字体更简单、更方便。然而,如果您的代码无法访问文件系统资源,或者字体与应用程序或小程序的其余部分一起打包在Java Archive(JAR)文件中,您可能需要一个InputStream对象。

createFont方法创建一个新的Font对象,其点大小为1,样式为PLAIN。然后可以使用Font.deriveFont方法基于这个基础字体来衍生新的Font对象,这些对象具有不同的大小、样式、转换和字体特性。例如:

try {
     //返回的字体大小为1pt
     Font font = Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf"));

     //衍生并返回一个12pt的版本:
     //需要使用float,否则
     //它会被解释为样式

     return font.deriveFont(12f);

} catch (IOException|FontFormatException e) {
     //处理异常
}

使用deriveFont方法很重要,因为由应用程序创建的字体不是底层字体系统所知的字体集合的一部分。因为deriveFont方法是基于最初创建的字体工作的,所以它没有这个限制。

解决此问题的方法是将创建的字体注册到图形环境中。例如:

try {
     GraphicsEnvironment ge = 
         GraphicsEnvironment.getLocalGraphicsEnvironment();
     ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf")));
} catch (IOException|FontFormatException e) {
     //处理异常
}

在向图形环境注册字体后,可以在调用getAvailableFontFamilyNames()时使用该字体,并可以在字体构造函数中使用。

逻辑字体

Java SE定义了以下五个逻辑字体系列:

这些字体在任何Java平台上都可用,并且可以看作是某些具有其名称所暗示属性的底层字体的别名。衬线字体类似于Times New Roman,通常用于打印。无衬线字体更适合屏幕使用。

这些字体可以根据用户的区域设置进行自定义。此外,这些字体支持最广泛的代码点(Unicode字符)。

除了字体系列,字体还具有其他属性,其中最重要的是样式大小。样式有加粗斜体

Java 2D API使用的默认字体是12磅的Dialog。这种字体是在正常的72-120 DPI显示设备上阅读文本的典型磅数。应用程序可以通过指定以下内容直接创建此字体的实例:

Font font = new Font("Dialog", Font.PLAIN, 12);

使用物理字体和逻辑字体的优缺点

物理字体使应用程序能够充分利用所有可用字体,实现不同的文本外观和最大的语言覆盖范围。然而,使用物理字体创建应用程序要困难得多。

将物理字体与应用程序捆绑在一起,使您能够创建具有相同外观的应用程序,并完全控制您要支持的应用程序。然而,捆绑的字体可能相当大,特别是如果您希望应用程序支持中文、日文和韩文。此外,您可能需要解决许可问题。

逻辑字体名称在任何地方都能正常工作,并且它们可以在主机操作系统本地化的至少一种语言中进行文本渲染(通常是更多语言的范围)。然而,用于渲染文本的物理字体在不同的实现、主机操作系统和区域设置之间有所不同,因此应用程序无法在任何地方实现相同的外观。此外,映射机制有时会限制可以呈现的字符范围。在JRE 5.0之前的版本中,后者曾经是一个大问题:例如,日文文本只能在日文本地化的主机操作系统上呈现,而不能在其他本地化系统上呈现,即使安装了日文字体。对于使用2D字体渲染的应用程序,在JRE 5.0及更高版本中,这个问题要少得多,因为映射机制现在通常能够识别和使用安装的所有支持的书写系统的字体。

字体配置文件

Java SE运行时环境使用字体配置文件将逻辑字体名称映射到物理字体。根据主机操作系统版本的不同,有几个文件支持不同的映射。这些文件位于JRE安装的lib目录中。您可以编辑或创建自己的字体配置文件,以调整映射到您特定的系统设置。有关更多信息,请参阅字体配置文件


上一页: 文本布局概念
下一页: 文本测量