如何从具有多个TTF文件的Font系列导入自定义java.awt.Font? (包括一个例子)

我知道您可以使用以下内容导入Java中的Font:

File file = new File(fontPath); Font font = Font.createFont(Font.TRUETYPE_FONT, file); // alternative: // Font font = Font.createFont(Font.TRUETYPE_FONT, new FileInputStream(file)); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); ge.registerFont(font); 

然后你会使用例如font.deriveFont(Font.PLAIN, 20); 获得所需的风格和大小。


但现在让我们看一下Consolas字体的例子,那里有四个TTF文件:

  • consola.ttf (Plain)
  • consolab.ttf (Bold)
  • consolai.ttf (斜体)
  • consolaz.ttf (Bold&Italic)

当然你可以用上面consola.ttf的方法导入consola.ttf ,然后使用font.deriveFont(Font.BOLD, 20); 与使用consolab.ttf因为简单字体只是转换为粗体字体。


示例图片

  1. 这里我用new Font("Consolas", Font.PLAIN, 20);安装了new Font("Consolas", Font.PLAIN, 20);new Font("Consolas", Font.BOLD, 20); (作为旁注,如果您使用deriveFont(Font.BOLD); ,如果在系统上安装了字体,您也会获得正确的粗体字体deriveFont(Font.BOLD); ):

使用已安装的TTF字体

  1. 这是consola.ttf ,使用createFont和派生的粗体字体导入(两者的大小均为20,如上例所示):

使用导入的TTF和派生的粗体字体


好吧,当安装它不是一个问题,但我不希望其他人有自定义字体,所以我想把TTF放入jar文件,以便我可以在初始化期间通过getResourceAsStream(path)导入它们。

有没有办法导入所有相关的TTF,然后只需调用new Font("Custom Font Name", fontStyle, fontSize); 所以它像安装的字体一样使用(图1),它看起来不像派生的’假’粗体字(图2)?

我不确定究竟是什么问题。 你得到了所有的TTF文件,你必须导入并注册它们。 以下测试使用未安装在我的系统上的DejaVu Sans字体。


测试1

 Font f = Font.createFont(Font.TRUETYPE_FONT, new File("dvs.ttf")); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); ge.registerFont(f); Font dvs = new Font("DejaVu Sans", Font.PLAIN, 20); 

这是一个带有plain( dvs )和派生粗体dvs.deriveFont(Font.BOLD) )字体的图像。

在此处输入图像描述

测试2

 Font f = Font.createFont(Font.TRUETYPE_FONT, new File("dvs.ttf")); Font fb = Font.createFont(Font.TRUETYPE_FONT, new File("dvsb.ttf")); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); ge.registerFont(f); ge.registerFont(fb); Font dvs = new Font("DejaVu Sans", Font.PLAIN, 20); Font dvsb = new Font("DejaVu Sans", Font.BOLD, 20); 

这是一个普通( dvs )和真正粗体dvsb )字体的图像。

在此处输入图像描述

您可以通过查看font2DHandle来确认使用了正确的文件。

在此处输入图像描述在此处输入图像描述


我还测试了斜体粗体斜体 ,并且与Font#createFont(int, InputStream)方法一样有效。

上面的方法是有效的,因为字体是按其全名映射的(例如Arial,Arial Bold等),因此只要您的字体名称正确,您就可以注册一个系列的多个成员。