我创建了一个加载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)。