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

2022-09-04 04:05:53

我知道你可以用这样的东西在Java中导入字体:

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


但是现在让我们以字体为例,那里有四个TTF文件:Consolas

  • consola.ttf(普通)
  • consolab.ttf(粗体)
  • consolai.ttf(斜体)
  • consolaz.ttf(粗体和斜体)

当然,您可以使用上述方法导入,但使用与使用不同,因为普通字体只是简单地转换为看起来像粗体字体。consola.ttffont.deriveFont(Font.BOLD, 20);consolab.ttf


示例图片

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

Using the installed TTF Fonts

  1. 这是 ,导入并派生为粗体字体(两者都具有大小 20,如上例所示):consola.ttfcreateFont

Using the imported TTF with derived bold Font


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

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


答案 1

我不确定问题到底是什么。您获得了所有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);

这是一个具有纯()和派生的粗体()字体的图像。dvsdvs.deriveFont(Font.BOLD)

enter image description here

测试 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);

这是一个具有纯()和真正粗体()字体的图像。dvsdvsb

enter image description here

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

enter image description hereenter image description here


我还测试了斜体粗体斜体,两者都有效,方法也很好。Font#createFont(int, InputStream)

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


答案 2