如何导入字体?

9
我想知道如何导入字体。
我正在尝试使用自定义下载的字体,但由于大多数计算机没有这种字体作为默认字体,因此运行此程序的计算机可能无法使用该字体。即使他们没有字体,我该怎么做才能让字体起作用?
我将在游戏结束屏幕上使用它,并需要显示一个得分,并希望该得分文本与该字体相同。这是图片。

enter image description here

如果有关系的话,我的电脑字体名称是Terminal

编辑:我假设它必须在java文件目录中具有字体,并且有某种方法可以使用它,但我不确定如何操作。还是有更好的方式吗?

编辑2:我找到了一个很好的教程,但需要一些帮助来处理这个问题...点击获取链接

编辑3:

URL fontUrl = new URL("http://www.webpagepublicity.com/" + "free-fonts/a/Airacobra%20Condensed.ttf");
Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(font);
g.setFont(font);

错误消息
File: F:\Computer Science\draw.java  [line: 252]
Error: F:\Computer Science\draw.java:252: font is not public in java.awt.Component; cannot be accessed from outside package

这是我正在尝试的内容:

URL fontUrl = new URL("http://img.dafont.com/dl/?f=badaboom_bb");
Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(font);
g.setFont(font);

编辑4:

File fontfile = new File("TexasLED.ttf");
File.toURI(fontfile).toURL(fontfile);
URL fontUrl = new URL("fontfile");

错误
Error: F:\Computer Science\draw.java:250: toURI() in java.io.File cannot be applied to (java.io.File)

你打算如何分发你的游戏:Java Web Start 还是特定平台的本地操作系统安装程序? - ecle
如果找不到字体名称,操作系统将尝试找到最接近它的字体。这被称为字体替换 - ecle
如果您打算从Java应用程序所在的位置运行该应用程序,则可以将字体文件复制到与应用程序相同的文件夹中,并要求应用程序引用它。Font font = Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf")); - ecle
1
使用“文件”是对一个短视问题的短视回答。 “字体”实际上是应用程序资源,因此应该被打包并通过URL访问(并将其转换为“InputStream”以在“createFont()”方法中使用)。 - Andrew Thompson
1
@Fogest 非法转义字符,嗯...在Java中你需要这样设置 "F:\\计算机科学\\Texas LED.ttf" - ecle
显示剩余39条评论
4个回答

14

'Airacobra Condensed'字体可从下载免费字体获取。

已注册的字体

import java.awt.*;
import javax.swing.*;
import java.net.URL;

class LoadFont {
    public static void main(String[] args) throws Exception {
        // This font is < 35Kb.
        URL fontUrl = new URL("http://www.webpagepublicity.com/" +
            "free-fonts/a/Airacobra%20Condensed.ttf");
        Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());
        GraphicsEnvironment ge = 
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        ge.registerFont(font);
        JList fonts = new JList( ge.getAvailableFontFamilyNames() );
        JOptionPane.showMessageDialog(null, new JScrollPane(fonts));
    }
}
好的,那很有趣,但这个字体实际上看起来怎么样呢?

展示字体

import java.awt.*;
import javax.swing.*;
import java.net.URL;

class DisplayFont {
    public static void main(String[] args) throws Exception {
        URL fontUrl = new URL("http://www.webpagepublicity.com/" +
            "free-fonts/a/Airacobra%20Condensed.ttf");
        Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());
        font = font.deriveFont(Font.PLAIN,20);
        GraphicsEnvironment ge =
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        ge.registerFont(font);

        JLabel l = new JLabel(
            "The quick brown fox jumps over the lazy dog. 0123456789");
        l.setFont(font);
        JOptionPane.showMessageDialog(null, l);
    }
}

3
(叹气)关于从网络加载“Font”的问题不是重点,因为这不是我的建议。热链接到“Font”的行为只是为了创建一个SSCCE。你有更好的方法来演示如何在“SC”(自包含)代码中加载自定义“Font”吗?就我个人而言,我会将“Font”包含在一个JAR文件中,并将其添加到应用程序的运行时类路径中。 - Andrew Thompson
这个答案似乎只适用于该网站上一半的字体,有什么想法吗?此外,还有其他网站可以使用这种方法吗?在提供的网站上的字体,在我看来,很丑。 - ylun.ca
2
@ylun.za "有什么想法为什么?" 提供一个 MCVE (最小完整可验证示例),以便进行失败分析。 "..这种方法还可以用于其他网站吗?" 从来没有打算让“现实世界”的应用程序通过热链接到互联网站点来获取其字体!请下载该字体并将其包含在其中一个应用程序 JAR 文件中。 - Andrew Thompson
我明白了。只需尝试另一个URL;我发现一个不起作用的是“Amiga Forever”字体。 - ylun.ca
1
@ylun.za 我不会去那个网站搜索你提到的字体。如果你想让我尝试一下,就像我做的那样,发布一个最小可复现示例。 - Andrew Thompson
显示剩余5条评论

4
您可以使用 GraphicsEnvironment.registerFont 方法。 http://docs.oracle.com/javase/6/docs/api/java/awt/GraphicsEnvironment.html#registerFont(java.awt.Font) 通过这个方法,您可以从 .ttf 文件中加载字体。
private static final Font SERIF_FONT = new Font("serif", Font.PLAIN, 24);

private static Font getFont(String name) {
    Font font = null;
    if (name == null) {
        return SERIF_FONT;
    }

    try {
        // load from a cache map, if exists
        if (fonts != null && (font = fonts.get(name)) != null) {
            return font;
        }
        String fName = Params.get().getFontPath() + name;
        File fontFile = new File(fName);
        font = Font.createFont(Font.TRUETYPE_FONT, fontFile);
        GraphicsEnvironment ge = GraphicsEnvironment
                .getLocalGraphicsEnvironment();

        ge.registerFont(font);

        fonts.put(name, font);
    } catch (Exception ex) {
        log.info(name + " not loaded.  Using serif font.");
        font = SERIF_FONT;
    }
    return font;
}

@Mr.Pallazzo 顺便说一句,抱歉打断了你的回答。我认为应该是的回答得到“勾选”。我只是把你的建议转化成了一个SSCCE(或两个,带有漂亮的屏幕截图)。 - Andrew Thompson

3
我已经解决了我的问题。我完成了。
URL fontUrl = new URL("file:///F:/Computer_Science/TexasLED.ttf");

那指向字体,对我有用!


0

你也可以使用应用程序jar文件中嵌入的字体。我多年来一直使用这个功能在我的项目中加载字体。

public Font getFont(String fileName) throws Exception {
    String path = "/xyz/isururanawaka/wb/fonts/" + fileName;
    URL url = getClass().getResource(path);
    return Font.createFont(Font.TRUETYPE_FONT, new File(url.toURI()));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接