我正在将自定义字体(从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()
报告已注册的字体,但根据its documentation,此方法
返回一个数组,其中包含此GraphicsEnvironment中可用的所有字体的一点大小实例。
(重点补充。)
另一个答案,尤其是对它的评论表明,Font
返回的GraphicsEnvironment.getAllFonts()
对象在其他方面也可能与传递给Font
的相应GraphicsEnvironment.registerFont()
实例不同。虽然我没有记录这些变化,但它们与从GE获得的Font
对象的预期用法一致,正如getAllFonts()
文档所述:
典型用法是允许用户选择特定字体。然后,应用程序可以通过调用所选实例上的deriveFont方法来调整字体大小并设置各种字体属性。
他们接着说
如果此GraphicsEnvironment中的字体具有多个可编程变体,则阵列中仅返回该Font的一个实例,并且应用程序必须派生其他变体。
我不肯定“多个可编程变量”意味着当你从另一个Font
对象派生一个getAllFonts()
对象时可以修改的属性(那么什么字体不会有可编程的变化?),但显然Font
不是一个机制回读以前提交给GraphicsEnvironment.registerFont()
的确切的ge.registerFont(mont)
物体。这些对象甚至可能不会被保留。
另一方面,您可以放心,您不负责提前注册您可能想要的所有不同的字体变体。
我想我知道这是什么问题。当你调用deriveFont()
时,它就是这样,它会注册底层字体,而不需要修改字体对象。 Font.getFont()
函数仅更改当前字体对象的状态,但不能修改实际字体。当您注册一个字体时,它的注册大小为1.如果您打印所有其他字体的大小,您会发现它们的默认值为1.我不认为您可以注册一个字体自定义默认大小,或覆盖Font.getFont()
的默认大小。当您使用specification获得字体时,它的默认大小始终为12(来自Font MontMediumItalic_20;
)。
如果你需要一个特殊格式的字体,我建议你创建一个静态类变量:
Font.decode()
然后在资源加载器或构造函数中加载一次字体,并对其应用所有修改。
或者,您也可以使用qazxswpoi
如果您需要任何帮助,请告诉我。