【发布时间】:2018-04-20 09:20:30
【问题描述】:
我正在构建一个包含大量场景的大型 JavaFX 应用程序,现在正尝试使用 Maven 部署该应用程序。
Maven 需要资源,例如FXML 文件,放在src/main/resources 下。这目前与我将新场景加载到主场景容器中的方式发生冲突。
我正在使用jewelsea 的一个小框架来加载新内容:Small JavaFX framework for swapping in and out child panes in a main FXML container.
到目前为止,这种方法效果很好。但是,现在我正在尝试从 src/main/resources 获取资源(FXML 文件),我遇到了 NullPointerExceptions。
我可以使用下面的方法很好地加载我的MAIN 视图,但所有其他视图都会抛出 NPE。
MAIN 场景是这样加载的:
FXMLLoader loader = new FXMLLoader();
Pane mainPane = loader.load(getClass().getResource(ViewNavigator.MAIN));
MainController mainController = loader.getController();
ViewNavigator.setMainController(mainController);
ViewNavigator.loadVista(ViewNavigator.CONFIGURE);
注意最后一行。我使用函数loadVista 来注入CONFIGURE 视图。该函数在ViewNavigator 类中声明:
static void loadVista(String fxml) {
try {
mainController.setVista(
FXMLLoader.load(
ViewNavigator.class.getClass().getResource(
fxml
)
)
);
} catch (IOException e) {
e.printStackTrace();
}
}
如您所见,exact 相同的方法用于获取 CONFIGURE 场景,但这次我遇到了 NPE:
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3246)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3210)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3179)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3152)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3129)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3122)
at com.demant.controller.ViewNavigator.loadVista(ViewNavigator.java:33)
at com.demant.controller.MainController.configureView(MainController.java:99)
... 58 more
在ViewNavigator 内部,MAIN 和 CONFIGURE 视图的 URL 声明如下:
static final String MAIN = "MainControllerView.fxml";
static final String CONFIGURE = "ConfigureView.fxml";
显然,我希望将我的资源文件放在src/main/resources 下,并将包标记为resources root。
希望有人能指出正确的方向。
谢谢。
【问题讨论】:
-
打开文件浏览器并查看您的构建文件夹(
target/classes,我认为,是使用 Maven 时的默认设置)。考虑到源层次结构中的设置,这应该有助于您了解所有内容在运行时的放置位置。
标签: java maven intellij-idea javafx