JAVAFX:位置未设置错误

我的项目在eclipse中正常运行但是当我创建这个项目的jar文件并尝试通过cmd运行时,它显示“Location not set set”错误.

我的项目结构是:

This is the structure of my project

方法是(在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文件和控制器放在同一个包中.

最佳答案
当您使用getClass().getResource(…)时,您正在加载资源,而不是指定文件的路径.在类加载器从文件系统加载类的情况下,这些基本上等同于同一个东西,它确实有效(尽管那时它没有技术原因).当类加载器通过其他机制加载类时(并且可能在所有情况下都可能),那么注意Java specifications for a resource是很重要的.

特别注意:

Resources, names, and contexts

A resource is identified by a string consisting of a sequence of
substrings, delimited by slashes (/), followed by a resource name.
Each substring must be a valid Java identifier. The resource name is of the form shortName or shortName.extension. Both shortName
and extension must be Java identifiers.

(我的重点.)由于..不是有效的Java标识符,因此无法保证此资源可解析.碰巧文件系统类加载器以您期望的方式解析它,这就是它在IDE中工作的原因,但是jar类加载器中的getResource(…)的实现并没有以您希望的方式实现它.

尝试

FXMLLoader loader = new FXMLLoader(getClass().getResource("/sm/customer/CustomerHome.fxml"));

使用控制器位置加载FXML:

既然你已经组织了你的代码,以便每个FXML与相应的控制器文件在同一个包中(我认为这是一种明智的做事方式),你也可以利用它加载FXML:只需加载FXML“相对于它的控制器“:

FXMLLoader loader = new FXMLLoader(CustomerHomeCtrl.class.getResource("CustomerHome.fxml"));

这在此设置中看起来相当自然,编译器将检查您在导入类时是否正确使用CustomerHomeCtrl的包名称.它还使重构变得容易:例如,假设您想将sm.admin拆分为多个子包.在Eclipse中,您将创建子包,将FXML和控制器拖放到相应的子包中,并且import语句将自动更新:不需要进一步更改.在getResource(…)中指定路径的情况下,所有这些都必须手动更改.

转载注明原文:JAVAFX:位置未设置错误 - 代码日志