物理和逻辑字体

字体有两种:物理字体和逻辑字体。物理字体是实际的字体库,例如,由 TrueType 或 PostScript Type 1 字体组成。物理字体可以是 Time,Helvetica,Courier 或任何其他多种字体,包括国际字体。逻辑字体是以下五个字体家族:Serif,SansSerif,Monospaced,Dialog 和 DialogInput。这些逻辑字体不是实际的字体库。而是,Java 运行时环境将逻辑字体名称 Map 到物理字体。

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

Physical Fonts

物理字体是实际的字体库,包含使用字型技术(例如 TrueType 或 PostScript Type 1)从字符序列 Map 到字形序列的字形数据和表,要获取系统中安装的所有可用字体家族的名称,请调用以下命令:

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

FontSelector 示例程序(在FontSelector.java中可用)说明了如何查找和选择这些字体。

Note:

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

Note:

如果看不到 Servlets 正在运行,则需要至少安装Java SE 开发套件(JDK)7版本。

Lucidia Fonts

Oracle 的 JRE 包含此物理字体系列,该字体也已获得许可,可用于 Java 平台的其他实现中。这些字体是物理字体,但不依赖于主机 os。

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

将物理字体与您的应用程序 Binding 在一起

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

使用以下方法之一从现有的物理字体创建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"));

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

createFont方法创建一个新的Font对象,其点大小为 1 且样式为PLAIN。然后可以将此基本字体与Font.deriveFont方法一起使用,以派生具有不同大小,样式,变换和字体 Feature 的新Font对象。例如:

try {
     //Returned font is of pt size 1
     Font font = Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf"));

     //Derive and return a 12 pt version:
     //Need to use float otherwise
     //it would be interpreted as style

     return font.deriveFont(12f);

} catch (IOException|FontFormatException e) {
     // Handle exception
}

使用deriveFont方法很重要,因为应用程序创建的字体不是基础字体系统已知的字体集的一部分。因为deriveFont方法可从最初创建的字体工作,所以它没有此限制。

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

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

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

Logical Fonts

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

  • Dialog

  • DialogInput

  • Monospaced

  • Serif

  • SansSerif

这些字体可在任何 Java 平台上使用,并且可以被视为具有其名称所隐含属性的某些基础字体的别名。 Serif 字体是类似于打印中常用的 Times New Roman 的字体。 Sans Serif 字体更典型地用于屏幕上。

这些字体可以针对用户的语言区域进行自定义。另外,这些字体支持最广泛的代码点(Unicode 字符)。

除了家族之外,字体还有其他属性,其中最重要的是* style size 。样式为 粗体斜体*。

Java 2D API 使用的默认字体是 12 pt 对话框。该字体是在普通 72–120 DPI 显示设备上阅读文本的典型磅值。应用程序可以通过指定以下内容直接创建此字体的实例:

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

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

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

通过将物理字体与应用程序 Binding 在一起,您可以创建到处都具有相同外观的应用程序,并且可以完全控制要支持的应用程序。但是,Binding 字体可能会很大,尤其是如果您希望您的应用程序支持中文,日文和韩文。此外,您可能需要解决许可问题。

逻辑字体名称保证可以在任何地方使用,并且它们至少可以使用主机 os 本地化的语言(通常是更大范围的语言)来进行文本呈现。但是,用于呈现文本的物理字体在不同的实现,主机 os 和语言环境之间会有所不同,因此应用程序无法在各处实现相同的外观。同样,Map 机制有时会限制可以呈现的字符的范围。后者曾经是 5.0 之前的 JRE 版本上的一个大问题:例如,即使已安装了日语字体,日语文本也只能在日语本地化的主机 os 上呈现,而不能在其他本地化系统上呈现。对于使用 2D 字体渲染的应用程序,此问题在 JRE 5.0 及更高版本中更为罕见,因为 Map 机制现在通常可以识别并使用所有支持的书写系统的字体(如果已安装)。

字体配置文件

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