2015-10-26 109 views
2

一旦我在mac中运行,swing应用程序中的jfxpanel崩溃。它运行在Windows罚款,但在下面的错误MAC来了,貌似是与字体,但不知道为什么,请大家帮忙javafx JFXPanel嵌入在mac中的swing应用程序崩溃

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 
+0

类似于[JavaFX的loadSkinClass失败](http://stackoverflow.com/questions/33029022/javafx-loadskinclass-failed),其原来的海报固定通过使用Java 8而不是Java 7.还类似于[Mac OSX El Capitan上的JDK 7/JavaFX 2应用程序](http://stackoverflow.com/questions/33339949/jdk-7-javafx-2-application-on-mac-osx-el-capitan)。 – jewelsea

+0

@jewelsea:谢谢你的回复。其实我们正在使用java for mac。并使用mac提供的最新版本。所以我不能从oracle使用java。 –

回答

2

您正在使用的运行时环境不使用JavaFX兼容。

这是不可取的。与Apple Java Runtime for Mac兼容的JavaFX版本从未发布。如果您希望JavaFX for Mac正常运行,您应该使用Oracle Java 8+或OpenJDK 8+。如果您不能使用其中一种兼容的运行时,则不推荐使用JavaFX。

如果您正在使用Apple Java for Mac,因为您担心用户计算机上的应用程序的Java运行时可用,请考虑将您的应用程序打包为self-contained application,该应用程序嵌入了与应用程序兼容的运行时,而不依靠预先安装的运行时。

2

你有没有试过这种肮脏的黑客行为?我在某处发现,在OS X/el Capitan的JDK 7中出现了这个问题,但很可能它永远不会在JDK 7中得到修复。

所以我发现了这个肮脏的黑客攻击,它适用于我。 。

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 
     } 
    }