我用Java编写了一个程序,使用了一种默认情况下不存在于任何操作系统上的特殊字体。
在Java中是否有可能将这种特殊字体添加到操作系统中?例如,在Windows中将此字体复制到特殊的字体文件夹中。
如果可能的话,应该如何实现?
如果您在包中包含了字体文件(otf、ttf等),您可以通过此处描述的方法在应用程序中使用字体:
Oracle Java SE 6:java.awt.Font
Oracle 提供了教程示例来演示这个过程。
try {
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf")));
} catch (IOException|FontFormatException e) {
//Handle exception
}
我会建议用某种资源加载器对其进行封装,以免每次使用时都从包中重新加载文件。
更接近您原始问题的答案是将字体作为应用程序安装过程的一部分安装。该过程将取决于您选择的安装方法。如果不是桌面应用程序,则必须查看提供的链接。
这是我的做法!
//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);
如果你想用font在graphics2d或类似的东西里面画东西,这个方法适用:
InputStream stream = ClassLoader.getSystemClassLoader().getResourceAsStream("roboto-bold.ttf")
Font font = Font.createFont(Font.TRUETYPE_FONT, stream).deriveFont(48f)
根据Java教程,您需要创建一个新的字体并在图形环境中注册它:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf")));
此步骤完成后,该字体将在调用getAvailableFontFamilyNames()
时可用,并且可以在字体构造函数中使用。
配置:
final GraphicsEnvironment GE = GraphicsEnvironment.getLocalGraphicsEnvironment();
final List<String> AVAILABLE_FONT_FAMILY_NAMES = Arrays.asList(GE.getAvailableFontFamilyNames());
try {
final List<File> LIST = Arrays.asList(
new File("font/JetBrainsMono/JetBrainsMono-Thin.ttf"),
new File("font/JetBrainsMono/JetBrainsMono-Light.ttf"),
new File("font/Roboto/Roboto-Light.ttf"),
new File("font/Roboto/Roboto-Regular.ttf"),
new File("font/Roboto/Roboto-Medium.ttf")
);
for (File LIST_ITEM : LIST) {
if (LIST_ITEM.exists()) {
Font FONT = Font.createFont(Font.TRUETYPE_FONT, LIST_ITEM);
if (!AVAILABLE_FONT_FAMILY_NAMES.contains(FONT.getFontName())){
GE.registerFont(FONT);
}
}
}
} catch (FontFormatException | IOException exception) {
JOptionPane.showMessageDialog(null, exception.getMessage());
}
用法示例:
JLabel label1 = new JLabel("TEXT1");
label1.setFont(new Font("Roboto Medium", Font.PLAIN, 13));
JLabel label2 = new JLabel("TEXT2");
label2.setFont(new Font("Roboto", Font.PLAIN, 13));
注意: 只有系统中不存在的现有字体才会被注册。