# 物理和逻辑字体

> 原文： [https://docs.oracle.com/javase/tutorial/2d/text/fonts.html](https://docs.oracle.com/javase/tutorial/2d/text/fonts.html)

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

本节帮助您确定在应用程序中使用的字体类型。它包括以下主题：

*   [物理字体](#physical-fonts)
    *   [Lucidia Fonts](#lucidia-fonts)
    *   [将物理字体与您的应用程序捆绑](#bundling-physical-fonts-with-your-application)
*   [逻辑字体](#logical-fonts)
*   [使用物理和逻辑字体的优点和缺点](#advantages-and-disadvantages)
*   [字体配置文件](#font-configuration-files)

物理字体是包含字形数据的实际字体库，以及使用字体技术（如 TrueType 或 PostScript Type 1）从字符序列映射到字形序列的表。要获取系统中安装的所有可用字体系列的名称，请调用以下命令： ：

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

```

FontSelector 示例程序（ [`FontSelector.java`](examples/FontSelector.java) 中提供）说明了如何定位和选择这些字体。

* * *

**Note:** Applications should not assume that any particular physical font is present. However, the logical fonts are a safe choice because they are always present. See [Logical Fonts](#logical-fonts) for more information.

* * *

&lt;applet alt="FontSelector applet" archive="examples/lib/FontSelectorApplet.jar" code="FontSelector" height="300" width="500"&gt;&lt;param name="permissions" value="sandbox"&gt;&lt;/applet&gt;

* * *

**Note:**  If you don't see the applet running, you need to install at least the [Java SE Development Kit (JDK) 7](http://www.oracle.com/technetwork/java/javase/downloads/index.html) release.

* * *

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"));

```

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

`createFont`方法创建一个新的`Font`对象，其点大小为 1，样式为`PLAIN`。然后，此基本字体可与`Font.deriveFont`方法一起使用，以导出具有不同大小，样式，变换和字体特征的新`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()`调用，并可用于字体构造函数。

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

*   `Dialog`
*   `DialogInput`
*   `Monospaced`
*   `Serif`
*   `SansSerif`

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

可以为用户的区域设置自定义这些字体。此外，这些字体支持最广泛的代码点（Unicode 字符）。

除了家庭，字体还有其他属性，其中最重要的是 _ 风格 _ 和 _ 大小 _。样式为 **Bold** 和 _Italic_ 。

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

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

```

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

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

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

Java SE 运行时环境使用字体配置文件将逻辑字体名称映射到物理字体。有几个文件支持不同的映射，具体取决于主机操作系统版本。这些文件位于 JRE 安装中的`lib`目录中。您可以编辑或创建自己的字体配置文件，以调整特定系统设置的映射。有关详细信息，请参阅[字体配置文件](https://docs.oracle.com/javase/8/docs/technotes/guides/intl/fontconfig.html)。