Javafx Toolkit初始化字体加载

时间:2015-12-05 13:10:36

标签: java maven javafx javafx-8

我创建了一个加载JavaFX字体的简单测试:

public class JavaFXFontTest {
    @Test
    public void testDirectDefaultFontInitialisation() {
        Font font = Font.getDefault();

        assertNotNull(font);
    }
    @Test
    public void testTextWithLoadedFont() {
        String defaultFont = "/fonts/starnberg.ttf";
        Font font = Font.loadFont(getClass().getResourceAsStream(defaultFont), 12);

        Text text = new Text();
        text.setFont(font);
        text.setText("42");

        assertNotNull(font);
    }
}

此测试在Linux和Windows上的IDE中运行时没有问题。但是,当我想在我的Maven构建中运行它时,我遇到问题,其中是Internal graphics not initialized yet。如果代码调用Toolkit.getToolkit(),则通常会出现这种情况。

追踪堆栈跟踪我已经在PrismFontFactory中找到了这个方法:

   public static float getSystemFontSize() {
        if (systemFontSize == -1) {
            if (isWindows) {
                float uiScale = Screen.getMainScreen().getUIScale();
                systemFontSize = getSystemFontSizeNative() / uiScale;
            } else if (isMacOSX || isIOS) {
                systemFontSize = MacFontFinder.getSystemFontSize();
            } else if (isAndroid) {
               systemFontSize = AndroidFontFinder.getSystemFontSize();
            } else if (isEmbedded) {
                try {
                    int screenDPI = Screen.getMainScreen().getResolutionY();
                    systemFontSize = ((float) screenDPI) / 6f; // 12 points
                } catch (NullPointerException npe) {
                    // if no screen is defined
                    systemFontSize = 13f; // same as desktop Linux
                }
            } else {
                systemFontSize = 13f; // Gnome uses 13.
            }
        }
        return systemFontSize;
    }

这解释了为什么它适用于Linux,因为那里有特定于环境的案例。我不清楚为什么它在IDE(IntelliJ)上可以在Windows上运行,但我怀疑,Toolkit是事先初始化的,并且测试运行不在分叉的JVM中运行。 我怎样才能解决问题,所以Maven构建在任何地方运行,最好也在无头环境中运行?

我可以force the Toolkit to become initialized,但这需要依赖内部API,这将使我遇到最新的JDK 9(Jigsaw)。

0 个答案:

没有答案