Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVAFX:未设置位置错误_Java_Eclipse_Javafx_Javafx 8 - Fatal编程技术网

JAVAFX:未设置位置错误

JAVAFX:未设置位置错误,java,eclipse,javafx,javafx-8,Java,Eclipse,Javafx,Javafx 8,我的项目在eclipse中正常运行,但当我创建这个项目的jar文件并试图通过cmd运行它时,它显示“Location is not set”错误 我的项目结构是: 方法是(在eclipse中运行): 这个代码有什么问题 有一些相关的问题,但它们与之不同。他们的代码没有在IDE中运行,但我的代码在IDE中运行 仅供参考:我对文件夹结构做了一些更改,并能够成功运行。但这种结构很糟糕,因为我将所有FXML文件和控制器放在同一个包中。当您使用getClass().getResource(…)时,您正在

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

我的项目结构是:

方法是(在eclipse中运行):

这个代码有什么问题

有一些相关的问题,但它们与之不同。他们的代码没有在IDE中运行,但我的代码在IDE中运行


仅供参考:我对文件夹结构做了一些更改,并能够成功运行。但这种结构很糟糕,因为我将所有FXML文件和控制器放在同一个包中。

当您使用
getClass().getResource(…)
时,您正在加载一个资源,而没有指定文件的路径。在类加载器从文件系统加载类的情况下,这些类本质上等同于相同的东西,并且它确实可以工作(尽管即使这样也没有技术上的原因)。当类加载器通过其他机制(可能在所有情况下都是如此)加载类时,重要的是要注意Java

请特别注意:

资源、名称和上下文

资源由一个字符串标识,该字符串由一系列 子字符串,由斜杠(/)分隔,后跟资源名称。 每个子字符串必须是有效的Java标识符。资源名称的格式为shortName或shortName.extension。都是短名 扩展必须是Java标识符

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

试一试


使用控制器位置加载FXML: 由于您已经组织了代码,因此每个FXML都与相应的控制器文件位于同一个包中(我认为这是一种明智的做法),因此您也可以在加载FXML时利用这一点:只需“相对于其控制器”加载FXML:


在这个设置中,这似乎相当自然,编译器将在导入类的位置检查您是否具有
CustomerHomeCtrl
的包名。它还使重构变得容易:例如,假设您想要将
sm.admin
拆分为多个子包。在Eclipse中,您将创建子包,将FXML和控制器拖放到适当的子包中,导入语句将自动更新:不需要进一步的更改。如果路径是在
getResource(…)
中指定的,那么所有这些都必须手动更改。

有点晚了,但这可能会对某些人有所帮助。如果您正在使用IntelliJ,您的
资源
文件夹可能不会标记为资源文件夹,该文件夹具有以下图标:

这是我修复它的方式:

为什么它毫无意义?相对路径是相对于类的包的。感谢您提供了这个很棒的解决方案。“它现在工作得很好。”普西更新了答案,使之更加精确。如果这更有意义,你会感兴趣吗?我想真正的问题是你操作的文件系统。本机文件系统支持“.”,而jar文件系统不支持“.”t@tomsontom我想我的观点是,有一个独立于文件系统的资源命名行为规范。只要资源名称符合该规范,无论应用程序如何部署,它都将工作。(理论上,即使底层文件系统的要求比资源命名规范更严格。)@jewelsea承认在SO/javafx上有几十个类似的问题(我在搜索时永远找不到),但没有一个答案真正解决了这个问题(我将解释为“为什么使用文件系统类加载器而不使用jar类加载器”这一点我认为更接近于此。。。
@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();
}
FXMLLoader loader = new FXMLLoader(getClass().getResource("/sm/customer/CustomerHome.fxml"));
FXMLLoader loader = new FXMLLoader(CustomerHomeCtrl.class.getResource("CustomerHome.fxml"));