java - 尊重 Java/Swing 中的字体连字

标签 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);
}

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

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

jTextField.setFont(myFont);

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

最佳答案

找到了。

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

  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);
  • 从二进制加载字体后,必须通过 TextAttributes 设置连字,如下所示:
  • Map attributes = fixed.getAttributes();
    attributes.put(TextAttribute.LIGATURES, TextAttribute.LIGATURES_ON);
    fixed = fixed.deriveFont(attributes);
    

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

    关于java - 尊重 Java/Swing 中的字体连字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50631657/

    相关文章:

    java - 如何在hibernate中生成像long这样的字符串id?

    java - 扩展 JPanel 的类不会更新 UI

    java - 添加子菜单

    java - GUI 对象不绘制

    css - 一个元素,两种不同的字体和字体大小。可能的?

    emacs - 在 emacs (centos) 中使用 Inconsolata 字体

    python - 如何在 PyScripter 中更改字体(大小/系列)?

    java - 将 Keycloak 与 pgbouncer 一起使用

    java - 无法从 Firebase 检索信息到自定义 ListView Android

    java - Android 上的 Java 是否是原生的?