如何在 Java 中使用自定义字体?

Posted

技术标签:

【中文标题】如何在 Java 中使用自定义字体?【英文标题】:How can I use a custom font in Java? 【发布时间】:2011-08-04 20:56:02 【问题描述】:

我用 Java 编写了一个程序,它使用一种特殊字体,默认情况下在任何操作系统上都不存在该字体。

在 Java 中是否可以将这种特殊字体添加到操作系统中?例如,在 Windows 中,将此字体复制到特殊的 Fonts 文件夹中。

如果可以,怎么做?

【问题讨论】:

【参考方案1】:

这就是我的做法!

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

【讨论】:

你不能直接调用 ge.registerFont 变量 customFont 作为它的参数来阻止过多的输入吗? 您能否扩展一下答案?这与 dogbane 提供的解决方案有什么不同吗?需要打两次createFont吗?如果是,为什么?【参考方案2】:

如果你想用 graphics2d 或类似的字体来绘制,这个可行:

InputStream stream = ClassLoader.getSystemClassLoader().getResourceAsStream("roboto-bold.ttf")
Font font = Font.createFont(Font.TRUETYPE_FONT, stream).deriveFont(48f)

【讨论】:

为了清楚起见,这里的48f 是作为浮点数传递的字体大小。如果您将它作为整数传递,则它无法正常工作,因为该方法需要诸如 Font.BOLD 之类的 int 常量。如果您使用单个字体的不同大小或样式,则可以从单个 Font 对象中派生所有这些。【参考方案3】:

如果您在包中包含字体文件(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程序可以列出/使用新字体,而其他并行java应用程序对此仍然未知。但是,如果您安装另一种名称与系统名称相似的字体,它可能会替换后者,并且其他应用程序可能会停止持续工作......我前几天遇到过。所以,永远不要在系统范围内安装新的东西,只有在你 100% 确定自己在做什么的情况下才这样做。【参考方案4】:

从Java tutorial,你需要创建一个新字体并在图形环境中注册:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File("A.ttf")));

完成此步骤后,该字体可在对getAvailableFontFamilyNames() 的调用中使用,并可在字体构造函数中使用。

【讨论】:

以上是关于如何在 Java 中使用自定义字体?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 iOS 应用中使用自定义字体? [复制]

自定义字体和 XML 布局 (Android)

如何在 Xamarin Forms 中使用自定义字体(任何外部字体)作为嵌入资源?

如何在gmail中使用自定义字体?

Tailwind/CSS 使用自定义字体

如何在 iOS 应用程序中使用自定义字体? [复制]