【问题标题】:Respecting Font Ligatures in Java/Swing尊重 Java/Swing 中的字体连字
【发布时间】:2021-04-17 05:46:56
【问题描述】:

在处理 Java 中的 Swing 对象(以及 JFX,但我稍后会担心...)时,我遇到了一个让我非常摸不着头脑的问题。

这是我用来在程序中打开字体的代码。这很标准。

public static Font getFontFromFile(String filePath) throws FontFormatException, IOException {
    File fontFile = new File(filePath);
    return Font.createFont(Font.TRUETYPE_FONT, fontFile);
}

我的问题是,当我实际使用这些字体时,它们中的连字不被尊重。我的程序的核心功能之一是允许用户加载自定义字体,其中许多都有专门的连字。这些没有得到尊重,我不确定我做错了什么。如果用户键入两个字符,应该减少到一个连字,第二个字符会正常出现,不会发生任何转换。当我将字体加载到任何其他程序或文本编辑器中时,我看到连字完全符合我的预期。

我已经精简了代码,我实际上在几个地方将字体设置为绝对的裸骨,即使在我正在做一些简单的事情的地方,我也看到了(错误的)行为:

jTextField.setFont(myFont);

是否有一些我缺少的导入设置?还是需要在 2D 图形对象上进行全局翻转?任何帮助将不胜感激。谢谢,

【问题讨论】:

    标签: java swing fonts


    【解决方案1】:

    找到了。

    好的。所以。这令人沮丧,因为我正确设置了TextAttributes,同时通过一种长期存在的错误困扰的方法加载字体......连字应该在JTextFieldJTextArea对象中表示,但是在某些情况下,它们不会。有两点需要牢记。

    1. 有一个旧错误 (https://bugs.openjdk.java.net/browse/JDK-8139741) 会阻止在使用该模式时遵守连字
    // BROKEN PATTERN
    Font myFont = new Font(<FONT_FAMILY_NAME>, Font.PLAIN, 72);
    

    相反,字体连字只有在从二进制位置加载时才会受到尊重:

    // WORKING PATTERN
    File myFontFile = new File(<FILE_LOCATION>);
    Font fixed = Font.createFont(Font.TRUETYPE_FONT, myFontFile);
    
    1. 从二进制文件加载字体后,必须通过 TextAttributes 设置连字,如下所示:
    Map attributes = fixed.getAttributes();
    attributes.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON);
    fixed = fixed.deriveFont(attributes);
    

    当直接从操作系统加载字体时,我会在系统上找到实际的字体文件并将其作为二进制文件加载。很麻烦,但是很实用。

    【讨论】:

      【解决方案2】:

      至少在 Java2D 方面,我读到 this - see Figure 4-13 建议 Java 将简单地获取提供的代码点列表并为每个代码点呈现字形,而不是组合成连字。

      在 JavaFX 2 之前,javafx.scene.text.Font 上曾经有一个布尔值 ligatures 属性,声称控制是否使用连字,但 doesn't appear to be there anymore

      从历史上看(至少已经 7 年了),我不得不为连字解析 TT/OT 字体并手动进行组合(有时甚至是对字距调整)。

      【讨论】:

      • 您能否将我链接到显示您如何进行手动处理的内容?我真的在这里摸不着头脑,虽然最好让 Swing 自动为我处理这个问题,但我也愿意自己实现一些东西。
      • 抱歉,那是几年前的事了,公司(我不再为之工作)拥有代码。本质上,我们根据所提供的字体定义构建了一个我们需要处理的所有情况的查找表(例如“ffl”或“V”后跟需要字距调整帮助的小型大写字母“A”),并扫描文本流.对于连字,我们进行了字形替换,对于字距调整,我们拆分了字符串并调整了下一段文本的起点。 (我们还需要进行智能/正确的断字,所以无论如何我们都需要扫描文本流。)
      猜你喜欢
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 2013-02-21
      • 2013-02-04
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2016-10-16
      相关资源
      最近更新 更多