【发布时间】:2011-08-04 20:56:02
【问题描述】:
我用 Java 编写了一个程序,它使用一种特殊字体,默认情况下在任何操作系统上都不存在该字体。
在 Java 中是否可以将这种特殊字体添加到操作系统中?例如,在 Windows 中,将此字体复制到特殊的 Fonts 文件夹中。
如果可以,怎么做?
【问题讨论】:
我用 Java 编写了一个程序,它使用一种特殊字体,默认情况下在任何操作系统上都不存在该字体。
在 Java 中是否可以将这种特殊字体添加到操作系统中?例如,在 Windows 中,将此字体复制到特殊的 Fonts 文件夹中。
如果可以,怎么做?
【问题讨论】:
这就是我的做法!
//create the font
try {
//create the font to use. Specify the size!
Font customFont = Font.createFont(Font.TRUETYPE_FONT, new File("Fonts\\custom_font.ttf")).deriveFont(12f);
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
//register the font
ge.registerFont(customFont);
} catch (IOException e) {
e.printStackTrace();
} catch(FontFormatException e) {
e.printStackTrace();
}
//use the font
yourSwingComponent.setFont(customFont);
【讨论】:
createFont吗?如果是,为什么?
如果你想用 graphics2d 或类似的字体来绘制,这个可行:
InputStream stream = ClassLoader.getSystemClassLoader().getResourceAsStream("roboto-bold.ttf")
Font font = Font.createFont(Font.TRUETYPE_FONT, stream).deriveFont(48f)
【讨论】:
48f 是作为浮点数传递的字体大小。如果您将它作为整数传递,则它无法正常工作,因为该方法需要诸如 Font.BOLD 之类的 int 常量。如果您使用单个字体的不同大小或样式,则可以从单个 Font 对象中派生所有这些。
如果您在包中包含字体文件(otf、ttf 等),则可以通过此处描述的方法在应用程序中使用该字体:
Oracle Java SE 6: java.awt.Font
有一个来自 Oracle 的 tutorial available 显示了这个示例:
try {
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf")));
} catch (IOException|FontFormatException e) {
//Handle exception
}
我可能会将其包装在某种资源加载器中,但不会在每次您想使用它时从包中重新加载文件。
与您的原始问题更密切相关的答案是将字体安装为应用程序安装过程的一部分。该过程将取决于您选择的安装方法。如果它不是桌面应用程序,您必须查看提供的链接。
【讨论】:
从Java tutorial,你需要创建一个新字体并在图形环境中注册:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf")));
完成此步骤后,该字体可在对getAvailableFontFamilyNames() 的调用中使用,并可在字体构造函数中使用。
【讨论】: