【问题标题】:How do you import a font?如何导入字体?
【发布时间】:2012-01-11 23:33:42
【问题描述】:

我想知道您将如何导入字体。

我正在尝试使用自定义下载的字体,但由于大多数要运行它的计算机都没有这种字体,因为它不是默认字体。即使他们没有字体,我该如何让字体工作?

我将它用于游戏结束屏幕,需要用它显示分数,并希望分数文本使用相同的字体。这是图片,

万一我电脑上的字体名称是Terminal

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

Edit2:我找到了一个很好的教程,但是我需要一些关于如何使用它的帮助...click me for link

编辑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 或特定于平台的本机操作系统安装程序?
  • 如果没有找到字体名称,操作系统会尝试找到靠近它的字体名称。它被称为font-substitution
  • @eee 现在将从编译器运行。这是一个学校项目。而且我不希望字体经过替换,否则看起来很难看。
  • @eee 使用File 是对短视问题的短视回答。 Font 实际上是一个应用程序资源,因此应该是 Jar'd 并通过 URL 访问(并将其转换为 InputStream 以在 createFont() 方法中使用)。
  • @Fogest 非法转义字符,嗯...你需要在 Java 中这样设置 "F:\\Computer Science\\Texas LED.ttf"

标签: java fonts awt


【解决方案1】:

你可以使用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 BTW - 很抱歉劫持你的答案。我觉得应该是你的答案得到“打勾”。我刚刚将您的建议变成了 SSCCE(或 2 个,带有漂亮的屏幕截图)。
【解决方案2】:

'Airacobra Condensed' 字体可从Download Free Fonts 获得。

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);
    }
}

【讨论】:

  • 我试过用这个: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); }catch(Exception e) { } g.setFont(font); 我得到这个错误:font cannot be accessed from outside package
  • @AndrewThompson 如果用户无法从 Internet 加载字体,尤其是当字体没有任何好的系统字体可以替代它时,想出一个后备机制会很好。
  • @eee (sigh) 关于从网上加载Font 的重点是..不是重点,因为这不是我的建议。热链接到Font 的行为仅仅是创建一个SSCCE。您是否有更好的 方法来演示在“SC”(自包含)代码中加载自定义Font?就我个人而言,我会将Font 包含在一个 Jar 中,该 Jar 会添加到应用程序的运行时类路径中。
  • @ylun.za “有什么想法吗?” 提供一个失败的MCVE(最小完整和可验证示例)。 “..还有其他网站可以使用这种方法吗?” 从来没有打算让“现实世界”的应用程序通过热链接到互联网站点来获取它们的字体!下载字体并将其包含在其中一个应用程序 Jar 中。
  • @ylun.za 我不会在那个网站上搜索你提到的字体。如果您想让我尝试,请像我一样发布 MCVE。
【解决方案3】:

我已经解决了我自己的问题。我已经完成了

URL fontUrl = new URL("file:///F:/Computer_Science/TexasLED.ttf");

这指向字体并为我工作!

【讨论】:

    【解决方案4】:

    您也可以使用嵌入在应用程序 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()));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 2015-11-26
      • 2017-02-04
      • 2021-09-20
      • 2018-03-12
      • 1970-01-01
      相关资源
      最近更新 更多