Java 字体

2025 年 8 月 4 日 | 阅读 10 分钟

字体是任何图形用户界面的基本组成部分,Java 提供了强大的支持来处理和显示字体。无论我们是使用 Swing 开发桌面应用程序,还是使用 JavaFX 开发 Web 应用程序,理解如何使用字体对于创建视觉吸引力强且易于阅读的文本至关重要。

Java 字体概述

Java 中的字体类型

Java 中的字体有两种类型

  • 物理字体
  • 逻辑字体

物理字体

物理字体是实际的 Java 字体库。它包含映射字符序列到字形序列的表,使用诸如 TrueType Fonts (TTF) 和 PostScript Type 1 Font 之类的字体技术。请注意,所有 Java 实现都必须支持 TTF。使用其他字体技术取决于实现。物理字体包括诸如 Helvetica, Palatino, HonMincho 等名称。

物理字体的特点是它使用有限的书写系统,例如 拉丁字符 或仅 日语基本拉丁字符。这可能会因配置更改而异。如果任何应用程序需要特定的字体,用户可以通过使用 Java 字体类的 createFont() 方法来捆绑并实例化该字体。

逻辑字体

Java 定义了 五种 逻辑字体系列

  • Serif (衬线体)
  • SansSerif (无衬线体)
  • Monospaced (等宽字体)
  • Dialog (对话框)
  • DialogInput (对话框输入)

JRE 必须支持这些字体。请注意,JRE 会将逻辑字体名称映射到物理字体,因为它们不是实际的字体库。通常,映射实现取决于区域设置。每个逻辑字体名称会映射到多个物理字体,以覆盖大量的字符。

例如,AWT 组件,如 LabelTextField,仅使用逻辑字体。

字体面和字体名称

一种字体可能有许多面,例如粗体、常规、中等、斜体、哥特体等。所有字体面都具有相似的排版设计。

Font 对象有三个不同的名称:

  • 逻辑字体名称: 用于构造字体的名称。
  • 字体面名称: 特定字体面的名称。例如,Helvetica Bold。
  • 字体族名称: 字体族的名称。它决定了多个字体面之间的排版设计。

Java Font 类表示一个字体面的实例,该字体面属于主机系统资源中存在的字体面集合。字体面的例子有 Arial Bold、Courier Bold Italic 等。一个字体面(每个字体面在大小、样式、变换和字体特征方面都有所不同)可能与多个 Font 对象相关联。

在 Java 中创建和使用字体

要在 Java 中创建字体,我们可以使用 Font 类的构造函数之一。这是一个基本示例:

在此示例中,创建了一个名为 "Serif",样式为普通,大小为 24 磅的新 Font 对象。Font 类还为常见的字体样式提供了常量,例如 Font.PLAIN、Font.BOLD 和 Font.ITALIC。

Font 类字段

修饰符字段描述
static intBOLD粗体样式常量。
static intCENTER_BASELINE在布局文本时,在中文、日文和韩文等表意文字脚本中使用的基线。
static StringDIALOG逻辑字体 "Dialog" 的规范字体族名称的字符串常量。
static StringDIALOG_INPUT逻辑字体 "DialogInput" 的规范字体族名称的字符串常量。
static intHANGING_BASELINE在布局文本时,在 Devanagiri 和类似脚本中使用的基线。
static intITALIC斜体样式常量。
static intLAYOUT_LEFT_TO_RIGHTlayoutGlyphVector 的一个标志,指示文本是从左到右的,这是通过 Bidi 分析确定的。
static intLAYOUT_NO_LIMIT_CONTEXTlayoutGlyphVector 的一个标志,指示 char 数组中超出指定限制的文本不应被检查。
static intLAYOUT_NO_START_CONTEXTlayoutGlyphVector 的一个标志,指示 char 数组中超出指定起始位置的文本不应被检查。
static intLAYOUT_RIGHT_TO_LEFTlayoutGlyphVector 的一个标志,指示文本是从右到左的,这是通过 Bidi 分析确定的。
static StringMONOSPACED逻辑字体 "Monospaced" 的规范字体族名称的字符串常量。
static Stringname此 Font 的逻辑名称, as passed to the constructor.
static intPLAIN普通样式常量。
static floatpointSize此 Font 的磅值,以 float 表示。
static intROMAN_BASELINE在布局文本时,在大多数拉丁语系脚本中使用的基线。
static StringSANS_SERIF逻辑字体 "SansSerif" 的规范字体族名称的字符串常量。
static StringSERIF逻辑字体 "Serif" 的规范字体族名称的字符串常量。
protected int大小此 Font 的磅值,四舍五入为整数。
protected intstyle此 Font 的样式, as passed to the constructor.
static intTRUETYPE_FONT标识 TRUETYPE 类型的字体资源。
static intTYPE1_FONT标识 TYPE1 类型的字体资源。

Font 类构造函数

构造函数描述
Font(Font font)根据指定的字体创建一个新的 Font。
Font(Map<?extends AttributedCharacterIterator.Attribute,?> attributes)使用指定的属性创建一个新的 Font。
Font(String name, int style, int size)根据指定的名称、样式和磅值创建一个新的 Font。

Font 类方法

方法描述
canDisplay(char c)检查此 Font 是否具有指定字符的字形。
canDisplay(int codePoint)检查此 Font 是否具有指定字符的字形。
canDisplayUpTo(char[] text, int start, int limit)指示此 Font 是否可以显示指定文本中从 start 到 limit 的字符。
canDisplayUpTo(CharacterIterator iter, int start, int limit)指示此 Font 是否可以显示 iter 指定的、从 start 到 limit 的文本。
canDisplayUpTo(String str)指示此 Font 是否可以显示指定的 String。
createFont(int fontFormat, File fontFile)使用指定的字体类型和指定的字体文件返回一个新的 Font。
createFont(int fontFormat, InputStream fontStream)使用指定的字体类型和输入数据返回一个新的 Font。
createGlyphVector(FontRenderContext frc, char[] chars)通过根据此 Font 中的 Unicode cmap 将字符一对一映射到字形来创建一个 GlyphVector。
createGlyphVector(FontRenderContext frc, CharacterIterator ci)通过根据此 Font 中的 Unicode cmap 将指定的字符一对一映射到字形来创建一个 GlyphVector。
createGlyphVector(FontRenderContext frc, int[] glyphCodes)通过根据此 Font 中的 Unicode cmap 将字符一对一映射到字形来创建一个 GlyphVector。
createGlyphVector(FontRenderContext frc, String str)通过根据此 Font 中的 Unicode cmap 将字符一对一映射到字形来创建一个 GlyphVector。
decode(String str)返回 str 参数所描述的 Font。
deriveFont(AffineTransform trans)通过复制当前 Font 对象并对其应用新的变换来创建一个新的 Font 对象。
deriveFont(float size)通过复制当前 Font 对象并对其应用新的大小来创建一个新的 Font 对象。
deriveFont(int style)通过复制当前 Font 对象并对其应用新的样式来创建一个新的 Font 对象。
deriveFont(int style, AffineTransform trans)通过复制此 Font 对象并应用新的样式和变换来创建一个新的 Font 对象。
deriveFont(int style, float size)通过复制此 Font 对象并应用新的样式和大小来创建一个新的 Font 对象。
deriveFont(Map<? extends AttributedCharacterIterator.Attribute,?> attributes)通过复制当前 Font 对象并对其应用新的字体属性集来创建一个新的 Font 对象。
equals(Object obj)将此 Font 对象与指定的 Object 进行比较。
getAttributes()返回此 Font 中可用的字体属性的 Map。
getAvailableAttributes()返回此 Font 支持的所有属性的键。
getBaselineFor(char c)返回适合显示此字符的基线。
getFamily()返回此 Font 的字体族名称。
getFamily(Locale l)返回此 Font 的字体族名称,并根据指定的区域设置进行本地化。
getFont(Map<?extends AttributedCharacterIterator.Attribute,?> attributes)返回一个适合于这些属性的 Font。
getFont(String nm)从系统属性列表中返回一个 Font 对象。
getFont(String nm, Font font)从系统属性列表中获取指定的 Font。
getFontName()返回此 Font 的字体面名称。
getFontName(Locale l)返回此 Font 的字体面名称,并根据指定的区域设置进行本地化。
getItalicAngle()返回此 Font 的斜体角度。
getLineMetrics(char[] chars, int beginIndex, int limit, FontRenderContext frc)返回一个使用指定参数创建的 LineMetrics 对象。
getLineMetrics(CharacterIterator ci, int beginIndex, int limit, FontRenderContext frc)返回一个使用指定参数创建的 LineMetrics 对象。
getLineMetrics(String str, FontRenderContext frc)返回一个使用指定的 String 和 FontRenderContext 创建的 LineMetrics 对象。
getLineMetrics(String str, int beginIndex, int limit, FontRenderContext frc)返回一个使用指定参数创建的 LineMetrics 对象。
getMaxCharBounds(FontRenderContext frc)返回在指定的 FontRenderContext 中定义的具有最大边界的字符的边界。
getMissingGlyphCode()返回当此 Font 没有指定 unicode 代码点的字形时使用的字形代码。
getName()返回此 Font 的逻辑名称。
getNumGlyphs()返回此 Font 中的字形数量。
getPeer()字体渲染现在是平台无关的。
getPSName()返回此 Font 的 PostScript 名称。
getSize()返回此 Font 的磅值,四舍五入为整数。
getSize2D()以 float 值返回此 Font 的磅值。
getStringBounds(char[] chars, int beginIndex, int limit, FontRenderContext frc)返回在指定的 FontRenderContext 中,指定字符数组的逻辑边界。
getStringBounds(CharacterIterator ci, int beginIndex, int limit, FontRenderContext frc)在指定的 FontRenderContext 中,返回在指定的 CharacterIterator 中索引的字符的逻辑边界。
getStringBounds(String str, FontRenderContext frc)返回在指定的 FontRenderContext 中,指定 String 的逻辑边界。
getStringBounds(String str, int beginIndex, int limit, FontRenderContext frc)返回在指定的 FontRenderContext 中,指定 String 的逻辑边界。
getStyle()返回此 Font 的样式。
getTransform()返回与此 Font 关联的变换的副本。
hashCode()返回此 Font 的哈希码。
hasLayoutAttributes()如果此 Font 包含需要额外布局处理的属性,则返回 true。
hasUniformLineMetrics()检查此 Font 是否具有统一的行度量。
isBold()指示此 Font 对象的样式是否为 BOLD(粗体)。
isItalic()指示此 Font 对象的样式是否为 ITALIC(斜体)。
isPlain()指示此 Font 对象的样式是否为 PLAIN(普通)。
isTransformed()指示此 Font 对象是否具有除 Size 属性之外还会影响其大小的变换。
layoutGlyphVector(FontRenderContext frc, char[] text, int start, int limit, int flags)返回一个新的 GlyphVector 对象,如果可能,执行文本的完整布局。
toString()将此 Font 对象转换为 String 表示。

在 Swing 中使用字体

Swing 是一个广泛使用的 Java 工具包,用于构建图形用户界面。字体是 Swing 组件(如标签、按钮和文本字段)的组成部分。要为 Swing 组件设置字体,请使用 setFont() 方法。这是一个示例:

此代码创建一个文本为 "Hello, World!" 的 JLabel,并将其字体设置为粗体、18 磅的 Serif 字体。

让我们看一个 Java Font 的示例。

文件名:JavaFontExample.java

要执行上述程序,请按照以下步骤操作:

i. 复制并粘贴上面的代码,并将文件保存为 JavaFontExample.java。

ii. 创建一个 HTM 文件并写入以下代码。

JavaFontExample.html

iii. 打开命令提示符并执行以下命令:

输出 1

Java Font

要获得以下输出,请对以下语句进行更改:

输出 2

Java Font

Java 中的自定义字体

除了标准字体,Java 还允许我们加载和使用自定义字体。这对于创建独特和品牌化的用户界面尤其有用。要加载自定义字体,我们通常使用 Font.createFont() 方法。让我们看看如何实现它。

此代码片段演示了如何从文件加载 TrueType 字体并将其注册到图形环境中,使其在整个应用程序中可用。

JavaFX 中的字体

JavaFX 是另一个强大的工具包,用于构建丰富的桌面应用程序。JavaFX 中的字体由 javafx.scene.text 包中的 Font 类处理。以下是如何在 JavaFX 应用程序中使用字体:

该示例创建一个文本节点,文本为 "Hello, JavaFX!",并将其字体设置为 20 磅的 Arial 字体。

高级字体功能

Java 的字体处理能力超越了基本的文本渲染。Font 类提供了用于更高级功能的方​​法,例如转换字体和测量文本尺寸。例如,我们可以从现有字体派生出具有不同大小或样式的字体。

在此代码中,从一个普通的 12 磅 Serif 字体派生出一个新的 14 磅粗体字体。

结论

字体是任何 Java 应用程序用户界面的关键方面。通过了解如何在 Java 中创建、自定义和使用字体,您可以增强应用程序的视觉吸引力和可读性。无论我们是使用 Swing 还是 JavaFX,Java 字体处理功能的灵活性和强大功能都确保我们能够提供精良且专业的用户体验。