JavaFX位置未设置错误消息[重复]

Posted

技术标签:

【中文标题】JavaFX位置未设置错误消息[重复]【英文标题】:JavaFX Location is not set error message [duplicate] 【发布时间】:2013-06-18 04:28:12 【问题描述】:

我在尝试关闭当前场景并在选择 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

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

提前致谢。

【问题讨论】:

【参考方案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"));

【讨论】:

当错误消息与问题无关时,我喜欢它;)编辑:帮助程序可能更通用:FXMLLoader(getClass().getResource("/" + report.getClass() .getCanonicalName().replaceAll(".","/").replaceAll("Controller", "") + ".fxml")); 你拯救了我的一天。谢谢 @DoctorHenry 谢谢。我仍在努力完全理解 FX……每一天都是新的斗争。 @ryan.s 不客气。我正在开发一个具有 JavaFX 和 android 版本的项目。 android 比 JavaFX 更舒适、更易于使用、更标准。我会讨厌 JavaFX。 我在更改为 maven 项目时收到此错误。我不得不将所有 fxml 文件移动到资源文件夹。【参考方案2】:

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

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

【讨论】:

感谢您发布“迟到的答案”,为我解决了问题:)【参考方案3】:

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

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

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

【讨论】:

这也是我的原因。我不知道为什么,但它修复了它。在 Eclipse 中,我是从菜单中执行的:Project -> Clean...,当我按下运行时它就起作用了。 似乎清理项目构建文件可以解决问题。也适用于 greadle clean。 哦,Eclipse 和 Netbeans ..... 让我成为了一个疯狂的开发人员......他们充满了该死的 bug。 我已经连续 4 个小时尝试解决这个问题,这解决了它!很奇怪!【参考方案4】:

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

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

【讨论】:

是的,这是可行的,如果您不想调用getClassLoader(),请务必在路径上指定根反斜杠,例如FXMLLoader(App.class.getResource("/fxml/ObjOverview.fxml")); 拯救了我的一天!如果你使用 maven,你必须将你的 fxml 文件存储在资源文件夹中! @Evaldas Illginis 有这个文件夹结构:resources/fxml/ObjOverview.fxml @Bolic 这个文件夹resources 必须在src 文件夹内吗?你知道这是否也应该在 Eclipse 中工作?【参考方案5】:
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../view/Main.fxml")); 

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

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/view/Main.fxml")); 

【讨论】:

在我的情况下,我必须做相反的事情并将“..”添加到路径中。【参考方案6】:

我尝试了一个快速简单的方法:

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

在我的登录类中,我使用来自app.guimainview.fxml,所以我在login.fxml 中这样做了

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

它有效:)

【讨论】:

请注意,如果资源被打包在一个jar文件中,..不会解析它们,因为jar:协议不支持..父目录定位器。【参考方案7】:

我在我的 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();      

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

【讨论】:

我在 Ubuntu 20.0.4 中遇到了同样的问题,一直在努力寻找答案。然而,这就像一个魅力!【参考方案8】:

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

【讨论】:

对不起,听起来像我妈妈:但同样重要的是要意识到,路径从类的包开始,这是由“getClass()”方法返回的。这不一定是代码所在的类。【参考方案9】:

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

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

FXMLLoader loader = new FXMLLoader();
loader.setLocation(getClass().getResource("/sample.fxml"));
rootLayout = loader.load();

【讨论】:

【参考方案10】:

我遇到了同样的问题。

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

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/[wrong-path]/abc.fxml"));
fxmlLoader.setClassLoader(getClass().getClassLoader());
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

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

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

【讨论】:

【参考方案13】:

我的意思是这样的:

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

试试吧,请告诉我。

【讨论】:

是的,它没有显示错误消息。但是您取消了 .close() ,因此这些阶段将继续堆叠而不会关闭。我想做的就像JFrame。你打开一个 JFrame,选择一些东西,然后当前的会关闭,然后再打开另一个。 哦,好吧,我不知道你在做什么:)。正如我之前所说,如果使用全局变量会更容易。添加场景 globalScene, 到 FXMLLoader myLoader = null;场景 myScene = null;阶段 prevStage = null;然后您将拥有一个场景,您可以旋转、关闭并创建另一个场景。 或者无论如何添加Stage CurrentStage = null, to FXMLLoader myLoader = null;场景 myScene = null;阶段 prevStage = null;然后您将拥有一个场景,您可以在该场景上旋转、关闭并创建另一个场景。现在您可以关闭 CurrentStage 并创建一个新的。让我知道它是否适合你。莱昂内尔【参考方案14】:

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

【讨论】:

你不应该移动一个类,只是因为它更方便你!每个类都有其用途,并且该用途应定义,它应位于您的包中的什么位置。【参考方案15】:

我偶然发现了同样的问题。程序通过“运行”按钮在 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"));

它适用于我在 Eclipse Mars 中的 e(fx)clipse 插件。

【讨论】:

【参考方案16】:

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

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

x.y.z

而不是

x/y/z

但如果您在 IntelliJ 中设置了某些选项,则在导航器中它们看起来都像 x.y.z

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

【讨论】:

顺便说一句。 Location not set 赢得了我对最无用异常描述的投票。我猜 JavaFX 开发人员从未听说过%s【参考方案17】:

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

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

【讨论】:

【参考方案18】:

我也遇到了同样的问题,我把FXML名字改成控制器类中的FXML文件,问题就解决了。

【讨论】:

【参考方案19】:

这对我很有效:

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

【讨论】:

LLoader myLoader = new FXMLLoader(YourProductControlClassHere.class.getResource("creatProduct.fxml"));在调用子包 .fxml 并使用它的控制类时帮助了我!'【参考方案20】:

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

【讨论】:

你认为这有帮助吗?【参考方案21】:

我也遇到过类似的问题,但是我重命名文件后就解决了,所以我建议你应该这样做

“只需​​重命名文件”

【讨论】:

以上是关于JavaFX位置未设置错误消息[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaFx 元素未绑定到 fx:id 上的控制器变量 [重复]

Firebase 项目初始化错误:未为此项目设置云资源位置

我不能使用 JavaFX [重复]

JavaFX不会连接到MYSQL [重复]

会话 ID 未显示错误消息注意:未定义索引:用户 ID [重复]

我的验证错误消息未显示(Javascript)