繁体   English   中英

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

[英]How to import a custom java.awt.Font from a Font family with multiple TTF files? (An example is included)

我知道您可以使用以下内容导入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 (Italic)
  • 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等),因此只要您的字体名称正确,您就可以注册一个系列的多个成员。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM