我正在开发一个 JavaFX 应用程序。其中一部分是虚拟键盘,需要能够显示默认字体中可能不存在的字符。我需要能够检测JavaFX 字体何时不支持字符。
\n\n我最初的想法是使用java.awt.Font#canDisplayUpTo
方法并使用以下方式搜索所有可用字体GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts()
,并通过这种方式获取字体名称来创建 JavaFX javafx.scene.text.Font
。
事实证明,java.awt.Font#canDisplayUpTo
即使派生的 JavaFX 字体不支持提供的 String,也会返回 -1(意味着支持所有字符)。java.awt.Font
我认为这是由于使用默认字体时实际上由复合字体支持的事实造成的- 至少这是我在调试代码时看到的。
private static Font defaultFont = Font.getDefault();\npublic String getFontName(String text) {\n //try default font\n java.awt.Font defaultFontAwt = new java.awt.Font(defaultFont.getName(), java.awt.Font.PLAIN, 16); //defaultFont.getFamily() produces the same result\n if (defaultFontAwt.canDisplayUpTo(text) == -1) {\n //this is always the case :(\n return defaultFont.getName();\n }\n //search through all available fonts\n GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();\n java.awt.Font[] fonts = e.getAllFonts();\n for (java.awt.Font font : fonts) {\n if (font.canDisplayUpTo(text) == -1) {\n return font.getName();\n }\n }\n //Failed to find font that is able to display text\n return defaultFont.getName();\n }\n
Run Code Online (Sandbox Code Playgroud)\n\n我的方法似乎是错误的,因为defaultFontAwt
复合字体包含的内容多于defaultFont
. 在我看来,我不能简单地创造java.awt.Font
,javafx.scene.text.Font
反之亦然。
是否有其他方法可以使用javafx.scene.text.Font
(最好不使用 AWT)检测不支持的字符?如果没有,是否可以不java.awt.Font
从默认的 javafx 字体创建复合材料?
我在 arch linux 上运行应用程序并使用等宽字体显示死字符(例如死 caron (\xcc\x8c))时遇到了这个问题。
\n\n非常感谢您阅读本文并提供帮助。
\n