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

时间:2019-03-18 19:21:46

标签: java graphics fonts size

我正在将自定义字体(来自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

2 个答案:

答案 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()

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