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

问题描述 投票:0回答:2

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

java graphics fonts size
2个回答
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()的确切的ge.registerFont(mont)物体。这些对象甚至可能不会被保留。

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


1
投票

我想我知道这是什么问题。当你调用deriveFont()时,它就是这样,它会注册底层字体,而不需要修改字体对象。 Font.getFont()函数仅更改当前字体对象的状态,但不能修改实际字体。当您注册一个字体时,它的注册大小为1.如果您打印所有其他字体的大小,您会发现它们的默认值为1.我不认为您可以注册一个字体自定义默认大小,或覆盖Font.getFont()的默认大小。当您使用specification获得字体时,它的默认大小始终为12(来自Font MontMediumItalic_20; )。

如果你需要一个特殊格式的字体,我建议你创建一个静态类变量:

Font.decode()

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

或者,您也可以使用qazxswpoi

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

© www.soinside.com 2019 - 2024. All rights reserved.