如何自动选择可以在javafx中显示提供的文本的字体?

时间:2019-04-11 17:14:17

标签: java javafx fonts

我正在开发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))时,我遇到了这个问题。

非常感谢您阅读本文并为您提供帮助。

0 个答案:

没有答案