我在使用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错误就会发生。
我知道我缺乏更多细节。我很难找到任何可以帮助我解决这个问题的物质。我希望有人可能知道发生了什么。
答案 0 :(得分:0)
我遇到了同样的问题。 它适用于 Windows,但不适用于 macOS。
原因是当前线程的类加载器为空。此问题已通过在加载 FXML 之前配置类加载器解决。
if(Thread.currentThread().getContextClassLoader() == null) {
Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader());
}
fxmlLoader = new FXMLLoader(getClass().getResource("DialogFX.fxml"));
fxmlLoader.load();