我正在将自定义字体(来自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
答案 0 :(得分:2)
但是,实际上并没有设置大小(固定为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()
对象的机制。这些对象甚至可能不会这样保留。
另一方面,也许您可以放心,您不必为预先注册所有可能需要的字体变化负责。
答案 1 :(得分:1)
我想我知道是什么问题。当您调用ge.registerFont(mont)
时,它就是这样做的,它注册了基础字体,而无需修改字体对象。 deriveFont()
函数仅更改当前字体对象的状态,而不能修改实际字体。当您注册一种字体时,它会以1的大小注册。如果您打印所有其他字体的大小,您会发现它们的默认值也都是1。自定义默认大小,或覆盖Font.getFont()
的默认大小。当您使用Font.getFont()
获得字体时,它将始终具有默认大小12(来自specification)。
如果您需要一种特殊格式的字体,我建议创建一个静态类变量:
Font MontMediumItalic_20;
然后在资源加载器或构造函数中加载一次字体,并对它应用所有修改。
或者,您也可以使用Font.decode()
如果您需要任何帮助,请告诉我。