如何在项目中加载font.ttf

时间:2018-03-23 21:30:07

标签: java fonts jar

这是我的问题:我正在尝试加载保存在我的项目中的字体,但我不知道该怎么做...这就是我尝试过的:

    private void registerFont(){

    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    try{
        ge.registerFont(Font.createFont(Font.TRUETYPE_FONT,new File(classLoader.getResource("net/utils/ttf/Press Style Extra L.ttf").getFile())));
    } catch(Exception e){
        e.printStackTrace();
    }
}

这是错误:

[Client thread / INFO]:[STDERR]:java.io.IOException:无法读取D:\ Client \ Client \ eclipse \ out \ production \ Client \ net \ utils \ ttf \ Press%20Style%20Extra %20L.ttf
[客户端线程/信息]:[STDERR]:在java.awt.Font.createFont(Font.java:1054)

2 个答案:

答案 0 :(得分:0)

我认为代码中存在的问题是:

classLoader.getResource("net/utils/ttf/Press Style Extra L.ttf").getFile()

准确地说.getFile()

  • getResource()从类路径返回资源的URL。
  • 考虑一下,如果你将你的字体放在jar文件中,那么路径与文件系统中的路径不一样(它指向罐子里面的东西)
  • Url.getFile()不会返回文件路径,但会返回网址的文件部分(https://docs.oracle.com/javase/7/docs/api/java/net/URL.html#getFile()

如果您使用的是classLoader.getResource(),那对您来说意味着您正在尝试从应用程序类路径中获取文件。在这种情况下,它可能会添加到您的资源或资源树的某个位置。在这种情况下,不需要采用“文件路径”,而只需直接使用流。

此代码适用于我:

        final ClassLoader loader = Thread.currentThread().getContextClassLoader();
        try (InputStream stream = loader.getResourceAsStream("Roboto-Thin.ttf")) {
            Font font = Font.createFont(Font.TRUETYPE_FONT, stream);
            System.out.println("Font: " + font);
        } catch (FontFormatException | IOException ex) {
            Logger.getLogger(FontLoader.class.getName()).log(Level.SEVERE, null, ex);
        }

提示:

  • 我正在使用当前线程中的类加载器(在动态环境中这是很好的做法,我不知道这是不是你的情况)
  • 我正在打开流而不是获取文件名
  • 字体位于jar文件

enter image description here

答案 1 :(得分:0)

try {
    final Font font = Font.createFont(Font.TRUETYPE_FONT, new BufferedInputStream(new FileInputStream("some_font.ttf"))).deriveFont(Font.PLAIN, 18);
} catch (Exception e) {
    e.printStackTrace();
}