javafx JFXPanel嵌入swing应用程序在mac崩溃



一旦我在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
        }
    }

最新更新