JavaFX 位置未设置错误消息

2022-08-31 15:19:29

我在尝试关闭当前场景并在选择meneItem时打开另一个场景时遇到问题。我的主舞台编码如下:

public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Shop Management");
    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("cartHomePage.fxml"));

    Pane myPane = (Pane) myLoader.load();

    CartHomePageUI controller = (CartHomePageUI) myLoader.getController();

    controller.setPrevStage(primaryStage);
    Scene myScene = new Scene(myPane);
    primaryStage.setScene(myScene);
    primaryStage.show();
}

当程序执行时,它将转到 cartHomePage.fxml。从那里,我可以选择在选择菜单项时转到创建产品或创建类别。这是我的操作事件:

Stage prevStage;

public void setPrevStage(Stage stage){
     this.prevStage = stage;
}

 public void gotoCreateCategory(ActionEvent event) throws IOException {
  Stage stage = new Stage();
    stage.setTitle("Shop Management");
    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("createCategory.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
    prevStage.close();
    setPrevStage(stage);
    stage.show();       
}

//Method to change scene when menu item create product is on click
@FXML
public void gotoCreateProduct(ActionEvent event) throws IOException {
   Stage stage = new Stage();
    stage.setTitle("Shop Management");
    FXMLLoader myLoader = new FXMLLoader(getClass().getResource("creatProduct.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
    prevStage.close();
    setPrevStage(stage);
    stage.show();      
}

但是,我只能切换舞台一次。例如,我的默认页面是 cartHomePage.fxml。当我运行程序时,首先我去创建产品阶段。在那之后,我不能再去任何地方了。错误消息是:

java.lang.IllegalStateException: Location is not set.
and Null Pointer Exception

在我关闭它并传递它之后,我确实设置了舞台。我想知道哪个部分出错了。

提前致谢。


答案 1

我有这个问题,发现了这篇文章。我的问题只是一个文件名问题。

FXMLLoader(getClass().getResource("/com/companyname/reports/" +
report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") +
".fxml"));

Parent root = (Parent) loader.load();

我有一个xml,这都是来自,我已经确保我的类与fxml文件相同,而不是单词控制器。

我搞砸了子字符串,所以路径是错误的...果然,在我修复了文件名后,它起作用了。

长话短说,我认为问题在于文件名命名不正确或路径错误。

补充:从那以后,我搬到了一个Maven项目。非 Maven 方法是将所有内容都放在项目路径中。下面答案中列出的Maven方式在开始时有点令人沮丧,但我对代码进行了如下更改:

FXMLLoader loader = new FXMLLoader(ReportMenu.this.getClass().getResource("/fxml/" + report.getClass().getCanonicalName().substring(18).replaceAll("Controller", "") + ".fxml"));

答案 2

我知道这是一个迟到的答案,但我希望帮助任何有这个问题的人。我收到相同的错误,并发现我必须在文件路径前面插入一个。然后,更正后的函数调用将为:/

FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/createCategory.fxml"));
//                                                           ^

推荐