我遇到了一个问题,让我在处理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图形对象上全局翻转?任何帮助将非常感谢。谢谢,
答案 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加载字体时,我已开始在系统上查找实际的字体文件并将其作为二进制文件加载。它很麻烦,但是可以起作用。