对于我当前的Project,我需要一个指向不同FXML文件的文件路径。我相对较快地了解到这不能用绝对路径完成,所以我使用MainApp.class.getResource()来获取资源文件的相对路径。但是,我无法让它发挥作用。我的代码如下所示:
public void initRootLayout() {
try {
// Load root layout from fxml file.
FXMLLoader loader = new FXMLLoader();
loader.setLocation(MainApp.class.getResource("../views/FXML/Root.fxml"));
rootLayout = (BorderPane) loader.load();
[...]
(在本例中,将Root.FXML文件加载到当前文件夹上方的一个文件夹中,在FXML文件夹中,该文件夹本身位于views文件夹中。
我的文件夹结构如下所示(我省略了此问题不需要的视图文件):
.
├── out
├── artifacts
└── LagerGUI
├── LagerGUI.html
├── LagerGUI.jar
└── LagerGUI.jnlp
├── logs
└── log.txt
└── production
├── Controllers
├── Logger
├── MainApp
├── META-INF
├── structs
└── views
├── src
| ├── MainApp
└── MainApp.java
└── views
├── Controllers
└── FXML
└──Root.FXML
当我在IDE中运行它时,一切都很完美。但是,当我尝试构建工件并从终端运行java -jar MyProject.jar
时,我得到以下内容:
[...]
Caused by: java.lang.IllegalStateException: Location is not set.
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2434)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
at MainApp.MainApp.initRootLayout(MainApp.java:226)
at MainApp.MainApp.start(MainApp.java:213)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$106(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$119(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null$117(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$118(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null$450(GtkApplication.java:139)
... 1 more
Exception running application MainApp.MainApp
javafx中的哪个意味着无法找到loader.setLocation()
中的位置网址。
有什么想法吗?
编辑此问题是重复:请注意,class.getResource方式适用于重复的问题,但在我的情况下不适用。