一旦我在mac中运行,jfxpanel在swing应用程序中崩溃。它在windows中运行良好,但在mac下面出现错误,看起来与字体有关,但不确定为什么,请帮助
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at com.sun.t2k.MacFontFinder.initPSFontNameToPathMap(MacFontFinder.java:339)
at com.sun.t2k.MacFontFinder.getAllAvailableFontFamilies(MacFontFinder.java:359)
at com.sun.t2k.T2KFontFactory.getFontFamilyNames(T2KFontFactory.java:1056)
at com.sun.prism.j2d.J2DFontFactory.getFontFamilyNames(J2DFontFactory.java:52)
at com.sun.webpane.sg.prism.WCFontImpl.getFont(WCFontImpl.java:37)
at com.sun.webpane.sg.prism.FXGraphicsManager.getWCFont(FXGraphicsManager.java:56)
at com.sun.webpane.webkit.network.URLLoader.twkDidFinishLoading(Native Method)
at com.sun.webpane.webkit.network.URLLoader.access$1300(URLLoader.java:44)
at com.sun.webpane.webkit.network.URLLoader$6.run(URLLoader.java:691)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:76)
Invalid memory access of location 0x0 rip=0x11c8c7b64
Segmentation fault: 11
您正在使用与JavaFX不兼容的运行时环境。
那是不可取的。与苹果的Mac Java运行时兼容的JavaFX版本从未发布。如果你希望JavaFX在Mac上正常工作,你应该使用Oracle Java 8+或OpenJDK 8+。如果您不能使用这些兼容的运行时之一,则不建议使用JavaFX。
如果你正在使用Apple Java for Mac,因为你担心你的应用程序的Java运行时在用户机上可用,那么考虑将你的应用程序打包为一个自包含的应用程序,它与你的应用程序嵌入一个兼容的运行时,而不依赖于预安装的运行时。
你试过这种肮脏的黑客行为吗?我在某个地方读到这个问题发生在OS X/el Capitan上的JDK 7中,但它很可能永远不会在JDK 7中得到修复。
所以我找到了这个肮脏的hack,它对我有用…
if (isMac()) {
try {
final Class<?> macFontFinderClass = Class.forName("com.sun.t2k.MacFontFinder");
final Field psNameToPathMap = macFontFinderClass.getDeclaredField("psNameToPathMap");
psNameToPathMap.setAccessible(true);
if (psNameToPathMap.get(null) == null) {
psNameToPathMap.set(
null, new HashMap<String, String>());
}
final Field allAvailableFontFamilies = macFontFinderClass.getDeclaredField("allAvailableFontFamilies");
allAvailableFontFamilies.setAccessible(true);
if (allAvailableFontFamilies.get(null) == null) {
allAvailableFontFamilies.set(
null, new String[] {});
}
} catch (final Exception e) {
// ignore
}
}