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

方法是(在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(...)中指定了路径,则必须手动更改所有路径。

10-05 17:46
查看更多