我正在将自定义字体(从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()
如果您需要任何帮助,请告诉我。