JavaFX位置未设置错误消息

50 java javafx stage nullpointerexception

我在选择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();
}
Run Code Online (Sandbox Code Playgroud)

程序执行后,将转到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();      
}
Run Code Online (Sandbox Code Playgroud)

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

java.lang.IllegalStateException: Location is not set.
and Null Pointer Exception
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

rya*_*n.s 47

我有这个问题并发现了这篇文章.我的问题只是文件名问题.

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

Parent root = (Parent) loader.load();
Run Code Online (Sandbox Code Playgroud)

我有一个xml,这都来自我,我确保我的类与fxml文件相同,而不是word控制器.

我弄乱了子串,所以路径错了......确定它修复了它起作用的文件名.

总而言之,我认为问题是文件名不正确或路径错误.

附加:我已经搬到了Maven项目.非Maven方式是将所有内容都放在项目路径中.下面的答案中列出的Maven方式在开始时有点令人沮丧,但我对我的代码进行了如下更改:

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


Dim*_*ris 23

我得到了这个例外,我发现的"解决方案"是通过Netbeans IDE,简单地说:

  1. 右键单击 - >"清理并构建"
  2. 再次运行项目

我不知道为什么会这样,但确实如此!

  • 似乎清理项目构建文件就可以了.也适用于greadle清洁. (5认同)

Eva*_*nis 16

我将一个简单的NetBeans 8 Java FXML应用程序转换为Maven驱动的应用程序.然后我遇到了问题,因为这些getResource()方法无法找到.fxml文件.在我的原始应用程序中,fxmls分散在包树中 - 每个都在其控制器类文件旁边.在我创建了Clean并在NetBeans中构建之后,我在目标文件夹中检查了结果.jar - .jar根本不包含任何fxml.所有的fxmls都奇怪地消失了.

然后我将所有fxmls放入resources/fxml文件夹并相应地设置getResource方法参数,例如:FXMLLoader(App.class.getClassLoader().getResource("fxml/ObjOverview.fxml")); 在这种情况下,一切都正常.fxml文件夹出现在.jar的根目录中,它包含我所有的fxmls.该计划按预期工作.

  • 是的,这是有效的,如果你不想调用`getClassLoader()`,重要的是在路径上指定根背斜杠,如`FXMLLoader(App.class.getResource("/ fxml/ObjOverview.fxml")) ;` (5认同)

小智 14

我知道这是一个迟到的答案,但我希望能帮助其他有这个问题的人.我得到了同样的错误,发现我必须/在我的文件路径前插入一个.更正后的函数调用将是:

FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/createCategory.fxml"));
//                                                           ^
Run Code Online (Sandbox Code Playgroud)


ZUR*_*dze 7

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/Main.fxml")); 
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我只是删除..

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/Main.fxml")); 
Run Code Online (Sandbox Code Playgroud)


Sau*_*uer 5

我的 JavaFX 应用程序中也遇到了同样的问题。更奇怪的是:在我的 Windows 开发环境中,fxml 加载程序一切正常。但是当我在 Debian 机器上执行完全相同的代码时,我遇到了类似的错误“位置未设置”。

我在这里阅读了所有答案,但似乎没有一个真正“解决”问题。我的解决方案很简单,我希望它对你们中的一些人有所帮助:

也许 Java 会因为getClass()方法而感到困惑。如果某些东西在不同的线程中运行或者您的类实现了任何接口,那么 getClass() 方法可能会返回与您的类不同的类。在这种情况下,您到 creatProduct.fxml 的相对路径将是错误的,因为您的“are”不在您认为的路径中......

因此,为了节省开支:更加具体,并尝试在您的类上使用静态类字段注意 YourClassHere.class)。

@FXML
public void gotoCreateProduct(ActionEvent event) throws IOException {
   Stage stage = new Stage();
    stage.setTitle("Shop Management");
    FXMLLoader myLoader = new FXMLLoader(YourClassHere.class.getResource("creatProduct.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
    prevStage.close();
    setPrevStage(stage);
    stage.show();      
}
Run Code Online (Sandbox Code Playgroud)

意识到这一点后,我将始终这样做。希望有帮助!


kay*_*aya 5

我尝试了一个快速而简单的事情:

我有两个包 ->app.guiapp.login

在我的登录类中,我使用mainview.fxmlfromapp.gui所以我在login.fxml

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../gui/MainView.fxml"));
Run Code Online (Sandbox Code Playgroud)

它有效:)

  • 请注意,如果资源打包在 jar 文件中,`..` 将不会解析它们,因为 `jar:` 协议不支持 `..` 父目录定位器。 (10认同)

Lio*_*jee 1

我的意思是这样的:

FXMLLoader myLoader = null; Scene myScene = null; Stage prevStage = null;

public void start(Stage primaryStage) throws Exception {
  primaryStage.setTitle("Shop Management");
  myLoader = new FXMLLoader(getClass().getResource("cartHomePage.fxml"));
  Pane myPane = (Pane) myLoader.load();
  CartHomePageUI controller = (CartHomePageUI) myLoader.getController();
  controller.setPrevStage(primaryStage);
  myScene = new Scene(myPane);
  primaryStage.setScene(myScene);
  primaryStage.show();
}
Run Code Online (Sandbox Code Playgroud)

在那之后

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

public void gotoCreateCategory(ActionEvent event) throws IOException {
    Stage stage = new Stage();
    stage.setTitle("Shop Management");
    myLoader = new FXMLLoader(getClass().getResource("createCategory.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
// prevStage.close(); I don't think you need this, closing it will set preStage to null   put a breakpoint after this to confirm it
    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");
    myLoader = new FXMLLoader(getClass().getResource("creatProduct.fxml"));
    Pane myPane = (Pane) myLoader.load();            
    Scene scene = new Scene(myPane);
    stage.setScene(scene);
// prevStage.close(); I don't think you need this, closing it will set preStage to null put a breakpoint after this to confirm it
    setPrevStage(stage);
    stage.show();      
}
Run Code Online (Sandbox Code Playgroud)

请尝试一下并告诉我。