在处理 Java 中的 Swing 对象时,我遇到了一个让我非常头疼的问题(还有 JFX,但我稍后会担心……)。
这是我用来在程序中打开字体的代码。这是很标准的。
public static Font getFontFromFile(String filePath) throws FontFormatException, IOException {
File fontFile = new File(filePath);
return Font.createFont(Font.TRUETYPE_FONT, fontFile);
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我实际使用这些字体时,它们中的连字不被尊重。我的程序的核心功能之一允许用户加载自定义字体,其中许多具有专门的连字。这些没有得到尊重,我不确定我做错了什么。如果用户键入两个应该简化为单个连字的字符,则第二个字符将正常显示,不会发生任何转换。当我将字体加载到任何其他程序或文本编辑器中时,我看到连字完全符合我的预期。
我已经精简了代码,我实际上在几个地方将字体设置为绝对裸露的骨骼,即使在我做一些简单的事情的地方,我也看到了(错误的)行为:
jTextField.setFont(myFont);
Run Code Online (Sandbox Code Playgroud)
是否有一些我缺少的导入设置?或者需要在 2D 图形对象上全局翻转?任何帮助将不胜感激。谢谢,
找到了。
好的。所以。这个令人沮丧,因为我一直在正确设置TextAttributes, 同时通过一种长期存在的错误困扰的方法加载字体......连字应该在JTextField和JTextArea对象中表示,但在某些情况下,它们不会。有两件事要记住。
// BROKEN PATTERN
Font myFont = new Font(<FONT_FAMILY_NAME>, Font.PLAIN, 72);
Run Code Online (Sandbox Code Playgroud)
相反,只有从二进制位置加载字体连字才会被遵守:
// WORKING PATTERN
File myFontFile = new File(<FILE_LOCATION>);
Font fixed = Font.createFont(Font.TRUETYPE_FONT, myFontFile);
Run Code Online (Sandbox Code Playgroud)
Map attributes = fixed.getAttributes();
attributes.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON);
fixed = fixed.deriveFont(attributes);
Run Code Online (Sandbox Code Playgroud)
当直接从操作系统加载字体时,我已经开始在系统上查找实际的字体文件并将其作为二进制文件加载。这很麻烦,但它的功能。
| 归档时间: |
|
| 查看次数: |
511 次 |
| 最近记录: |