Java:使用 deriveFont 不会改变字体大小



我正在将自定义字体(从ttf文件)加载到我的项目中,并使用deriveFont(float f)来更改大小。但是,实际上并未设置大小(停留在 1)。这是我的代码:

public static void main(String[] args) {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
try {
Font mont =
Font.createFont(
Font.TRUETYPE_FONT,
new File(System.getProperty("user.dir") + "/data/Montserrat-MediumItalic.ttf"))
.deriveFont(20f);
ge.registerFont(mont);
Arrays.stream(ge.getAllFonts())
.filter(font -> font.getFontName().contains("Mont"))
.forEach(font -> System.out.println(font.getFontName() + ", Size: " + font.getSize()));
} catch (FontFormatException | IOException e) {
e.printStackTrace();
}
}

输出:Montserrat Medium Italic, Size: 1

注意:将font.getSize()替换为font.getSize2D打印件1.0

新增:使用解码:

我现在正在使用这个

Font test = Font.decode("Montserrat Medium Italic-ITALIC-20");

(固定类未加载)

更新 2:

这一行:Font mont = Font.createFont(Font.ITALIC, new File(System.getProperty("user.dir") + "/data/Montserrat-MediumItalic.ttf")); 投掷IllegalArgumentException: font format not recognized

但是,实际上并没有设置大小(停留在 1)。

这种情况似乎不太可能发生。 我在评论这个问题时要求直接确认("mont.getSize()返回什么?"——哎呀,多么令人尴尬的糟糕语法),但到目前为止你还没有回答。 我有理由相信,如果您检查,您将看到mont.getSize()评估到您要求的大小。

对于您观察到的行为,另一种解释是现成的。 您正在使用GraphicsEnvironment.getAllFonts()来报告注册的字体,但根据其文档,此方法

返回一个数组,其中包含所有字体的单磅大小实例在此图形环境中可用。

(强调后加。

另一个答案,尤其是对它的评论表明,GraphicsEnvironment.getAllFonts()返回的Font对象也可能在其他方面与传递给GraphicsEnvironment.registerFont()的相应Font实例不同。 尽管据我所知,这些变化没有记录在案,但它们与从 GE 获得Font对象的预期用法一致,如getAllFonts()文档所述:

典型的用法是允许用户选择特定字体。然后,应用程序可以通过在所选实例上调用 deriveFont 方法来调整字体大小并设置各种字体属性。

他们接着说

如果此图形环境中的字体具有多个可编程变体,则数组中仅返回该字体的一个实例,并且应用程序必须派生其他变体。

我不肯定"多个可编程变体"是指当您从另一个对象派生一个Font对象时可以修改的属性(那么什么字体没有可编程变化?),但很明显,getAllFonts()不是一种机制,用于回读以前呈现给GraphicsEnvironment.registerFont()对象的确切Font。 这些对象甚至可能不会保留。

另一方面,您也许可以放心,您不负责提前注册您可能想要的所有不同字体变体。

我想我知道问题出在哪里。当你调用ge.registerFont(mont)时,它正是这样做的,它注册基础字体,而不对字体对象进行修改。deriveFont()函数仅更改当前字体对象的状态,但不能修改实际字体。注册字体时,该字体将以 1 大小注册。如果打印所有其他字体的大小,您会发现它们也具有默认值 1。我认为您无法使用自定义默认大小注册字体,或覆盖Font.getFont()的默认大小。当您使用Font.getFont()获取字体时,它将始终具有默认大小 12(来自规范)。

如果您需要对字体进行特殊格式化,我建议您创建一个静态类变量:

Font MontMediumItalic_20;

然后在资源加载器或构造函数中加载字体一次,并对其应用所有修改。

或者,您也可以使用Font.decode()

如果您需要任何帮助,请告诉我。

相关内容

  • 没有找到相关文章

最新更新