如何导入字体?

Posted

技术标签:

【中文标题】如何导入字体?【英文标题】: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" 【参考方案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()));

【讨论】:

以上是关于如何导入字体?的主要内容,如果未能解决你的问题,请参考以下文章

如何将字体导入Notepad ++?

思源字体怎么导入pic

如何将新字体导入项目 - Angular 5

如何在 Xcode 中为 Iphone 应用程序导入字体 [重复]

将字体导入java(不使用Swing)

如何在项目期间使用 xcode 导入新字体 [重复]