如何导入字体?
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()));
【讨论】:
以上是关于如何导入字体?的主要内容,如果未能解决你的问题,请参考以下文章