FXML无法在OS X上的后续运行中加载

时间:2016-07-26 03:53:09

标签: java macos javafx

我在使用Java 8u91。我的应用程序UI是Swing和一些JavaFX的混合体。让我感到难过的是我的应用程序在安装后第一次正常运行,但在后续尝试时无法加载。这只发生在OS X上。

我得到 javafx.fxml.loadException 打开FXML,这是由 javafx.fxml.FXMLLoader.loadTypeForPackage

中的NPE引起的

我的代码很简单:

    FXMLLoader fxmlLoader = null;

    try {
        fxmlLoader = new FXMLLoader(getClass().getResource(
                "DialogFX.fxml"));
    } catch(Exception e) {
    }

    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);

    try {
        fxmlLoader.load();
    } catch (IOException e) {
        e.printStackTrace();
    }

我也尝试过使用资源的完整和相对路径。它们都在OS X上失败,而所有(包括所有路径类型)都可以在Windows和Linux上运行。

我发现第一次运行时为什么它运行良好的一个小线索是,在主应用程序线程上有几个项目可以完成(例如将应用程序jar中的小资源复制到某些目录),而JavaFX线程做它自己的事情。

但JFX组件不依赖于这些已安装的资源;我冒着某种延迟有助于克服OS X上的JFX错误,并且由于安装过程不会在后续运行中发生,因此JFX错误就会发生。

我知道我缺乏更多细节。我很难找到任何可以帮助我解决这个问题的物质。我希望有人可能知道发生了什么。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。 它适用于 Windows,但不适用于 macOS。

原因是当前线程的类加载器为空。此问题已通过在加载 FXML 之前配置类加载器解决。

if(Thread.currentThread().getContextClassLoader() == null) {
    Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader());
}
fxmlLoader = new FXMLLoader(getClass().getResource("DialogFX.fxml"));
fxmlLoader.load();