61

我在尝试关闭当前场景并在选择 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。从那里,我可以选择在选择菜单项时创建产品或创建类别。这是我的动作事件:

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

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

提前致谢。

4

21 回答 21

56

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

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"));
于 2014-03-06T20:25:52.213 回答
29

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

FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/createCategory.fxml"));
//                                                           ^
于 2017-05-24T23:30:36.813 回答
28

我遇到了这个异常,我发现的“解决方案”是通过 Netbeans IDE,简单地说:

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

我不知道为什么这有效,但确实有效!

于 2014-01-04T10:56:27.020 回答
21

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

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

于 2014-07-24T21:38:17.590 回答
7
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/Main.fxml")); 

就我而言,我只是删除..

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/Main.fxml")); 
于 2018-07-06T07:17:52.793 回答
5

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

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

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

所以在保存方面:更具体并尝试在您的 Class 上使用静态类字段注意 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();      
}

意识到这一点后,我会一直这样做。希望有帮助!

于 2015-09-08T20:46:40.153 回答
5

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

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

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

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../gui/MainView.fxml"));

它有效:)

于 2015-11-10T09:37:52.450 回答
3

这通常不会使位置路径正确。重要的是要意识到路径从代码所在的当前包开始,而不是从项目的根目录开始。只要你得到这个相对路径正确,你应该能够在这种情况下避开这个错误。

于 2014-09-01T02:06:27.927 回答
3

我认为问题是布局名称不正确或布局文件路径无效。

对于 IntelliJ,您可以创建资源目录并在其中放置布局文件。

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample.fxml"));
rootLayout = loader.load();
于 2017-07-07T09:11:28.060 回答
2

我有同样的问题。

几分钟后,我发现我正在尝试从错误的位置加载 file.fxml。

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/[wrong-path]/abc.fxml"));
fxmlLoader.setClassLoader(getClass().getClassLoader());
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();
于 2015-09-21T09:38:05.513 回答
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();
}

在那之后

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();      
}

试试看,请告诉我。

于 2013-06-21T08:14:34.980 回答
1

CsPeitch 和其他人的以下答案是正确的。只需确保将 fxml 文件复制到您的类输出目标,否则运行时将看不到它。检查生成的类文件目录,看fxml是否存在

于 2015-08-14T20:34:52.267 回答
1

对于 Intellij 用户,我的问题是我的 fxml 文件 (src/main/resources) 所在的目录未标记为“资源”目录。

打开模块/项目设置转到源选项卡并确保 Intellij 知道该目录包含项目资源文件。

于 2016-08-08T18:21:41.410 回答
0

我偶然发现了同样的问题。程序通过“运行”按钮在 Eclipse 中运行良好,但不是从我之前导出的可运行 JAR 中运行。我的解决方案是:

1) 将Main类移动到默认包

2) 为 Eclipse 设置其他路径,并在从 JAR 文件运行时设置其他路径(将其粘贴到Main.java中)

public static final String sourcePath = isProgramRunnedFromJar() ? "src/" : "";
public static boolean isProgramRunnedFromJar() {
    File x = getCurrentJarFileLocation();
    if(x.getAbsolutePath().contains("target"+File.separator+"classes")){
        return false;
    } else {
        return true;
    }
}
public static File getCurrentJarFileLocation() {
        try {
            return new File(Main.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        } catch(URISyntaxException e){
            e.printStackTrace();
            return null;
        }
}

然后在start方法中你必须加载这样的文件:

FXMLLoader loader = new FXMLLoader(getClass().getResource(sourcePath +"MainScene.fxml"));

它在带有e(fx)clipse插件的 Eclipse Mars 中对我有用。

于 2016-02-16T18:24:27.777 回答
0

这发生在我身上,我找到了解决方案。如果您使用具有启动行 () 的类的不同包中的 .fxml 文件构建项目,Parent root = FXMLLoader.load(getClass().getResource("filenamehere.fxml"));并使用相对路径,则除了第一个窗口之外,您的窗口在运行 jar 时将不会启动。为了简短起见,将 .fxml 文件与启动它的类放在同一个包中,并像这样设置路径(“filenamehere.fxml”),它应该可以正常工作。

于 2015-08-08T13:39:52.403 回答
0

我有同样的问题。这是一个没有指定正确路径的简单问题。

右键单击您的.fxml文件并选择属性(对于那些使用 eclipse 的其他 IDE 不会有太大差异),然后复制从开始/packagename到结束的位置,这应该可以解决问题

于 2017-05-10T01:06:04.400 回答
0

这对我很有效:

 public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws IOException {

        FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/TestDataGenerator.fxml"));
        loader.setClassLoader(getClass().getClassLoader());
        Parent root = loader.load();
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
于 2021-02-05T03:06:15.007 回答
0

我有同样的问题,我在控制器类中将FXML名称更改为FXML文件,问题就解决了。

于 2021-01-02T15:42:56.640 回答
0

我的很奇怪...... IntelliJ 特有的怪癖。

我查看了我的输出类,有一个文件夹:

xyz

代替

x/y/z

但是如果你在 IntelliJ 中设置了某些选项,在导航器中它们看起来都像 xyz

所以如果你摸不着头脑,请检查你的输出文件夹

于 2017-03-18T03:11:49.647 回答
-2

在我的情况下,错误的原因是我相应的 java 类中的运行时错误。我修好了,一切都很好。我的提示:不要搜索“未设置位置”

于 2019-08-29T20:30:06.793 回答
-2

I had faced he similar problem however it got resolved once i renamed the file , so i would suggest that you should

"Just rename the file"

于 2019-11-16T11:23:27.533 回答