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