尊重Java / Swing中的字体连接

时间:2018-05-31 19:41:12

标签: 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_FONT, fontFile);
}

我的问题是,当我真正使用这些字体时,其中的连字不受尊重。我的程序的核心功能之一允许用户加载自定义字体,其中许多字体具有专门的连字。这些都没有得到尊重,我不确定我做错了什么。如果用户键入两个应减少为单个连字的字符,则第二个字符只会正常显示,不会发生转换。当我将字体加载到任何其他程序或文本编辑器时,我看到连字符完全按照我预期的方式得到尊重。

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

jTextField.setFont(myFont);

我缺少哪些导入设置?或者需要在2D图形对象上全局翻转?任何帮助将非常感谢。谢谢,

2 个答案:

答案 0 :(得分:0)

至少就Java2D而言,我读了this - see Figure 4-13,建议Java只需要提供所提供的代码点列表,并为每个代码点呈现字形,而不需要组合来制作连字。

在JavaFX 2之前,javafx.scene.text.Font曾经有一个布尔<!-- CSS for the things we want to print (print view) --> <style type="text/css" media="print"> #SCREEN_VIEW_CONTAINER{ display: none; } .other_print_layout{ background-color:#FFF; } </style> <div id="SCREEN_VIEW_CONTAINER"> THIS PART WILL NOT BE PRINTED </div> <br /> <br /> <div id="PRINT_VIEW"> THIS PART WILL BE PRINTED </div> 属性声称可以控制是否使用了连字,但是doesn't appear to be there anymore

历史上(已经至少7年)我必须解析TT / OT字体的连字并手动进行组合(有时甚至是对字距调整)。

答案 1 :(得分:0)

发现它。

好的。所以。这很令人沮丧,因为我已经正确设置了TextAttributes,同时通过一种受长期存在的错误困扰的方法来加载字体。应该在JTextFields和JTextAreas中表示连字,但是在某些情况下,它们不会。有两件事要牢记。

1)有一个古老的错误(https://bugs.openjdk.java.net/browse/JDK-8139741),它在使用模式时会阻止连字的出现

// BROKEN PATTERN
Font myFont = new Font(<FONT_CAMILY_NAME>, Font.PLAIN, 72);

相反,仅当从二进制位置加载字体时,才考虑字体的连字:

// WORKING PATTERN
File myFontFile = new File(<FILE_LOCATION>);
Font fixed = Font.createFont(Font.TRUETYPE_FONT, myFontFile);

2)从二进制加载字体后,必须通过TextAttributes设置连字,如下所示:

Map attributes = fixed.getAttributes();
attributes.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON);
fixed = fixed.deriveFont(attributes);

直接从OS加载字体时,我已开始在系统上查找实际的字体文件并将其作为二进制文件加载。它很麻烦,但是可以起作用。