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

时间:2014-07-17 10:18:50

标签: java fonts import awt

我知道您可以使用以下内容导入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(平原)
  • consolab.ttf(大胆)
  • consolai.ttf(斜体)
  • consolaz.ttf(Bold& Italic)

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


示例图片

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

    1. 这是consola.ttf,使用createFont导入并导出粗体字体(两者的大小均为20,如上例所示):
    2. Using the imported TTF with derived bold Font


      安装好后它不是问题,但我不希望别人有自定义字体,所以我想把TTF放到jar文件中,这样我就可以在初始化过程中通过{{}导入它们。 1}}。

      有没有办法导入所有相关的TTF,然后只需调用getResourceAsStream(path),使其像安装的字体(图片1)一样使用,并且它看起来不像派生的'假'粗体字体(图2)?

1 个答案:

答案 0 :(得分:3)

我不确定究竟是什么问题。你得到了所有的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);

以下是包含普通(dvs)和派生粗体dvs.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);

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

enter image description here

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

enter image description here enter image description here


我还测试了斜体 粗体斜体 ,两者都和Font#createFont(int, InputStream)方法一样。

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

相关问题