JavaFX 位置未设置错误消息

标签 java nullpointerexception javafx stage

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

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。从那里,我可以选择在选择菜单项时创建产品或创建类别。这是我的 Action 事件:

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

我在关闭舞台并将其传递出去后确实设置了舞台。我想知道哪个部分出了问题。

提前致谢。

最佳答案

我遇到了这个问题并找到了这篇文章。我的问题只是文件名问题。

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

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

我有一个 xml,这一切都来自,并且我已确保我的类与 fxml 文件相同,减去单词 Controller 。

我弄乱了子字符串,所以路径是错误的......果然在我修复了文件名后它就工作了。

长话短说,我认为问题要么是文件名命名不正确,要么是路径错误。

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

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

关于JavaFX 位置未设置错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57989983/

相关文章:

JavaFX:设置文本区域的焦点

java - 对象值更改后更新 Android 中的按钮?

java - 测试 Android Content Provider 的奇怪行为

java - JNI 检测到应用程序错误 : use of deleted weak global reference

java - 如何限制hibernate criteria API获得的结果?

java - 作用于 View 时出现 NullPointerException

java - 为什么这个查询返回NULL?

java - 空对象引用上的“android.content.res.Resources android.content.Context.getResources()”。将字符串数组转换为语音

JavaFX 仅使用 CSS 控制笔画样式?

java - 如何获取预定事件与 JavaFX GUI 交互