Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从包含多个TTF文件的字体系列中导入自定义java.awt.Font?(包括一个示例)_Java_Fonts_Import_Awt - Fatal编程技术网

如何从包含多个TTF文件的字体系列中导入自定义java.awt.Font?(包括一个示例)

如何从包含多个TTF文件的字体系列中导入自定义java.awt.Font?(包括一个示例),java,fonts,import,awt,Java,Fonts,Import,Awt,我知道您可以使用如下方式在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

我知道您可以使用如下方式在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)
以获得所需的样式和大小


示例

但现在让我们以font
Consolas
为例,这里有四个TTF文件:

  • consola.ttf
    (普通)
  • consolab.ttf
    (粗体)
  • consolai.ttf
    (斜体)
  • consolaz.ttf
    (粗体和斜体)
当然,您可以只使用上述方法导入
consola.ttf
,然后使用
font.deriveFont(font.BOLD,20)
与使用
consolab.ttf
不同,因为普通字体被简单地转换为粗体字体


示例图片

  • 在这里,我将安装的字体与新字体一起使用(“Consolas”,font.PLAIN,20)和
    新字体(“Consolas”,Font.BOLD,20)
    (作为旁注,如果系统上安装了字体,如果使用
    deriveFont(font.bold);
    ,也会得到正确的粗体字体):
  • 这是
    consola.ttf
    ,与
    createFont
    和派生的粗体字体一起导入(两种字体的大小均为20,如上例所示):

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


    是否有办法导入所有相关的TTF,然后只需调用
    新字体(“自定义字体名称”、字体样式、字体大小)以便它像已安装的字体一样使用(图1),并且看起来不像派生的“假”粗体字体(图2)?

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


    测试1 这是一张带有普通(
    dvs
    )和派生的bold
    dvs.deriveFont(Font.bold)
    )字体的图像

    测试2 这是一张带有普通(
    dvs
    )和真正的粗体(
    dvsb
    )字体的图像

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


    我还测试了italic和粗体italic
    ,这两种方法与
    Font#createFont(int,InputStream)
    方法一样有效


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

    超过2周,但仍然没有答案:(好问题,我正在寻找这个问题的答案。是的,遇到了类似的问题。我知道有点晚了,但ConsoleAS中的字体系列名称不同,对吗?
    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);
    
    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);