在Swing中选择等宽字体的正确方式

9

我正在使用DefaultStyledDocument并尝试找到正确的方法将样式设置为适当的等宽字体。所谓“适当”,是指选择的字体应满足以下条件:

  1. 用户计算机上存在等宽字体
  2. 用户指定的字体(Java中有标准方法吗?)
  3. 如果没有指定的字体,则会回退到标准等宽字体(“Monospaced”)。

这能够实现:

StyleConstants.setFontFamily(mainStyle, "Monospaced");

并且这也可以正常工作:

StyleConstants.setFontFamily(mainStyle, "Lucida Console");

但我似乎无法弄清楚如何判断所涉及的字体族是否存在于用户的计算机上(没有返回值可以设置setFontFamily),并且它是等宽字体。如果我使用“Lucida Consoleq”,它似乎会使用默认字体。

3个回答

4

Monospaced 是一个虚拟名称(类似于 Dialog),Java 会将其映射到系统的默认等宽字体。


1
但我不想使用默认值,因为它看起来有点糟糕。如果找不到我想要的值,我希望能够回退到默认值。 - Jason S

3
我认为你想要这个。
GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();

请查看javadoc

1
我必须枚举它们吗?没有一种方法可以仅测试是否存在一个吗? - Jason S
不,没有其他办法。GraphicsEnvironment 仍然需要枚举所有字体系列,以便告诉你所寻找的字体系列是否在系统中可用。你可以将返回的数组转换为列表(Arrays.asList),然后使用 List.contains 来确定字体系列是否已安装。 - undefined

3
请参考Java 1.5.0 API文档中的java.awt.Font类。您可以使用public static Font decode(String str)方法来实现您所需的操作。该方法的javadoc中最后一段是这样说明的:

默认字体大小为12,样式为PLAIN。如果str参数未指定有效字体大小,则返回字体大小为12的Font对象;如果str参数未指定有效字体样式,则返回样式为PLAIN的Font对象。如果str参数未指定有效字体名称,则此方法将返回一个“Dialog”系列的字体。要查看系统可用的字体系列名称,请使用GraphicsEnvironment.getAvailableFontFamilyNames()方法。如果str参数为空,则返回一个新的Font对象,其中字体系列名称为“Dialog”,且大小和样式分别为12和PLAIN。

如果您需要的字体系列不存在,则会返回“Dialog”。只要您没有得到这个返回值,那么这个字体系列就是存在的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接