This question already has an answer here:
How do I determine the correct path for FXML files, CSS files, Images, and other resources needed by my JavaFX Application?
(1个答案)
3个月前关闭。
我的项目在Eclipse中正常运行,但是当我创建该项目的jar文件并尝试通过cmd运行它时,显示“未设置位置”错误。
我的项目结构是:
![JAVAFX:未设置位置错误-LMLPHP JAVAFX:未设置位置错误-LMLPHP]()
方法是(在Eclipse中运行):
此代码有什么问题?
有一些相对的问题,但与之不同。他们的代码未在IDE中运行,但我的代码在IDE中运行。
仅供引用:我对文件夹结构进行了一些更改,并且能够成功运行。但是这种结构太可怕了,因为我将所有FXML文件和 Controller 都放在了同一个程序包中。
使用 Controller 位置加载FXML:
由于您已经组织了代码,因此每个FXML和其对应的 Controller 文件都在同一个程序包中(我认为这是明智的处理方式),因此您还可以在加载FXML时利用这一点:只需加载“相对于FXML”它的 Controller ”:
在此设置中,这似乎很自然,并且编译器将在导入类时检查您是否对
(1个答案)
3个月前关闭。
我的项目在Eclipse中正常运行,但是当我创建该项目的jar文件并尝试通过cmd运行它时,显示“未设置位置”错误。
我的项目结构是:
方法是(在Eclipse中运行):
@FXML
private void RegularCustomer(ActionEvent event) throws Exception{
Stage stage = (Stage) dailySales.getScene().getWindow();
Scene scene = dailySales.getScene();
FXMLLoader loader = new FXMLLoader(getClass().getResource("../customer/CustomerHome.fxml"));
System.out.println(loader.getLocation());
scene.setRoot(loader.load());
stage.setScene(scene);
stage.show();
}
此代码有什么问题?
有一些相对的问题,但与之不同。他们的代码未在IDE中运行,但我的代码在IDE中运行。
仅供引用:我对文件夹结构进行了一些更改,并且能够成功运行。但是这种结构太可怕了,因为我将所有FXML文件和 Controller 都放在了同一个程序包中。
最佳答案
使用getClass().getResource(...)
时,您正在加载资源,而不是指定文件的路径。在类加载器从文件系统加载类的情况下,它们实质上等同于同一件事,并且确实可以工作(尽管即使这样也没有技术原因)。当类加载器通过其他机制加载类时(可能无论如何在所有情况下),请务必注意Java specifications for a resource。
特别注意:
(我的重点是。)由于..
不是有效的Java标识符,因此不能保证此资源是可解析的。碰巧文件系统类加载器以您期望的方式解决了这个问题,这就是为什么它可以在您的IDE中工作的原因,但是jar类加载器中getResource(...)
的实现并没有按照您希望的方式实现。
尝试
FXMLLoader loader = new FXMLLoader(getClass().getResource("/sm/customer/CustomerHome.fxml"));
使用 Controller 位置加载FXML:
由于您已经组织了代码,因此每个FXML和其对应的 Controller 文件都在同一个程序包中(我认为这是明智的处理方式),因此您还可以在加载FXML时利用这一点:只需加载“相对于FXML”它的 Controller ”:
FXMLLoader loader = new FXMLLoader(CustomerHomeCtrl.class.getResource("CustomerHome.fxml"));
在此设置中,这似乎很自然,并且编译器将在导入类时检查您是否对
CustomerHomeCtrl
拥有正确的软件包名称。它还使重构变得容易:例如,假设您想将sm.admin
拆分为多个子包。在Eclipse中,您将创建子包,将FXML和 Controller 拖放到适当的子包中,并且import语句将自动更新:无需进行任何其他更改。如果在getResource(...)
中指定了路径,则必须手动更改所有路径。