关于Java/Swing中的字体连字

关于Java/Swing中的字体连字,java,swing,fonts,Java,Swing,Fonts,我遇到了一个在java中处理Swing对象(以及JFX)时让我头疼的问题,但我稍后会担心这个问题 下面是我用来在程序中打开字体的代码。这很标准 public static Font getFontFromFile(String filePath) throws FontFormatException, IOException { File fontFile = new File(filePath); return Font.createFont(Font.TRUETYPE_FON

我遇到了一个在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图形对象上全局翻转?任何帮助都将不胜感激。谢谢,

至少就Java2D而言,我认为Java只需获取提供的代码点列表,并为每个代码点呈现glyph,而无需组合成连字

早在JavaFX2之前,
JavaFX.scene.text.Font
上就有一个布尔
ligatures
属性,它声称控制是否使用了连字,但实际上是这样的


从历史上看(至少有7年了),我必须解析TT/OT字体的连字,并手动进行组合(有时甚至是成对紧排)。

找到了它。

嗯。所以这一次令人沮丧,因为我一直在正确设置
texttributes
,同时通过一个长期存在的bug所困扰的方法加载字体。。。连字应该在
JTextField
JTextArea
对象中表示,但在某些情况下,它们不会被表示。有两件事要记住

  • 在使用模式时,有一个旧的bug()阻止使用连字

  • 当直接从操作系统加载字体时,我开始在系统上查找实际的字体文件并将其作为二进制文件加载。这很麻烦,但它能正常工作。

    你能给我链接一些说明你如何进行手动操作的东西吗?我在这里真的是摸不着头脑,虽然让Swing自动为我处理这件事显然是最好的,但我也愿意自己实现一些东西。对不起,那是几年前的事了,代码归公司所有(我不再为该公司工作)。基本上,我们根据字体定义所提供的内容,建立了一个查找表,列出了我们需要处理的所有情况(例如,“ffl”或“V”,后跟需要字距调整帮助的小写字母“a”),并扫描了文本流。对于连字,我们进行了字形替换;对于字距调整,我们分割字符串并调整下一段文本的起点。(我们还需要进行智能/正确的断字,因此我们需要扫描文本流。)
    // 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);
    
    Map attributes = fixed.getAttributes();
    attributes.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON);
    fixed = fixed.deriveFont(attributes);