【问题标题】:FXML / FXMLLoader error diagnostic tool(s) sought寻求 FXML / FXMLLoader 错误诊断工具
【发布时间】:2014-07-23 09:23:16
【问题描述】:

概述

您好,这是一个大纲用例。我在 JavaFX Scene Builder 中开发了一个看似有效的 FXML 文件。它现在是一个重要的 XML 块,并且在 FXML 文件中的某处存在运行时加载错误。 Scene Builder 与“预览”选项配合得很好。我有一个“simple.fxml”文件,用于验证控制器是否按预期工作,它是相同的控件和事件,但没有额外的 FXML 布局。我有并且我正在执行剪切代码和测试循环来识别存在问题的 XML。所以我会在某个时候深入了解这一点。

目前,Scene Builder 和 Netbeans FXML 编辑器中都没有显示错误,并且我没有收到“JavaFX - loading FXML file error”(#1) 中的加载错误。我得到的只是 runnable 中结束任务的异常,它表示加载程序抛出了异常。

目标

会发生这些错误。问题是有哪些工具可用或正在开发中FXML 文件疑难解答

一些想法、问题或选择:

  1. 这是一个错误吗?记住像加载程序这样的黑匣子应该发出某种指示符,例如第 246 行的失败或“...指示查找位置的东西。
  2. 您有哪些技巧、技巧或建议可以更快地找到/解决此类错误?
    • 有使用Include的地方吗
  3. FXMLLoader 类上有哪些钩子可以在错误全部崩溃之前捕获或捕获错误?
  4. 是否有任何工具可以记录或诊断 FXMLLoader 处理?
  5. 有没有人编写过可以这样使用的自定义 FXMLLoader? (见#3)。
    • 我看到 FXML 使用 SAX,是否可以包装或挂钩解析器并为 FXMLLoader 提供备用解析器?
  6. 是否有任何用于分析 FXML 和 Java 应用程序的静态工具——比如 FXML Lint 之类的?
  7. 关于 FXML 的处理方式有哪些深入的 FXML 加载、解析、运行时信息可用。
  8. 是否有或是否可以添加或注入一些额外的入口点到控制器中以捕获 FXML 负载问题?
    • 例如,控制器是否可以级联,这样我就可以创建一个“根控制器”,它可能会在更接近原点的位置捕获问题。

目前,仅在加载时才发现的 FXML 内部的问题,如果编辑者什么都看不到,则只是耗时且不可预测。如果有人问,我想看看一些诊断工具

进一步的见解

这些是开发过程中出现的一些相关的“调试”和“疑难解答”技巧。也许其中一些可能有一天会进入 FXML Validator 或 Lint 工具(?)这些点没有特定的顺序,它们被编号用于交叉参考。

  1. FXML 中的任何控制器标识符必须存在,并在 Java 代码中使用 @FXML 进行注释。如果缺少注释,则不会加载 FXML。
  2. 每个带有 @FXML 注释的 Java 名称都应该在 FXML 标记文件中。说一个名为“myLabel”的标签:如果代码中使用了 myLabel,则会出现 NullPointerException。与案例 #1 不同,该文件将加载。
  3. 不要将 NetBeans 的“保存时编译”编译选项与 JavaFX 一起使用。它似乎在看似正确的代码上生成了虚假的 NullPointerException-s。
  4. 如果重命名/重构主应用程序,请确保更新构建目标(例如 maven 或 ant)。某些 IDE 重构代码可能会错过该链接。
  5. FXMLLoader() 确实给了你一个线索。如果您发现异常,您可以查看“getMessage()”...

    catch( Exception ex ){
           System.out.println("Exception on FXMLLoader.load()");
           System.out.println( ex.getMessage() );   //-- Doesn't show in stack dump
    }
    
  6. 检查您在 FXML 资源上的输入。小错别字是识别和检测的魔鬼。这适用于任何未经编译器或 lint 检查的字符串,而不仅仅是 FXML。

    // These two line are not the same:
    Parent root;
    root = FXMLLoader.load(getClass().getResource("Samplle.fxml"));
    root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
    
  7. exception.getMessage() 是:“Location required”,对于 #6 中的那个错字。

  8. 如果您手动编辑 FXML,请确保您所有相关组件。
  9. 记得在“-d”文件中包含 FXML 命名空间,例如需要在最外层的 XML 元素上。

    <TreeView id="treeView" fx:id="tree" xmlns:fx="http://javafx.com/fxml" ... >
    

希望有所帮助。这些是基于小型测试和试验的猜测。请修正对实际工作原理的误解的嵌入假设。

另见

  1. JavaFX - loading FXML file error
  2. Android diagnostic tool for applications(用例)
  3. I would like to override FXMLLoader. How can I do that?
  4. How does FXMLLoader load the FXML's controller?
  5. Cannot locate the fxml error for JavaFX(用例)
  6. Class javafx.fxml.FXMLLoader
  7. JavaFX Architecture(提供 PDF),很遗憾,这里没有关于 FXML 的内容。
  8. Introduction to FXML
  9. FXMLLoader.java source code

【问题讨论】:

    标签: java javafx javafx-2 fxml diagnostics


    【解决方案1】:

    我在使用 SceneBuilder 2.0 和 JavaFX2 时遇到了同样的问题。问题是 SceneBuilder 生成 JavaFX8 代码。代码有效但不是 100% 兼容 JavaFX2。也许这可能是你的问题。你应该从 FXMLLoader 中得到一个异常,错误所在的行。

    【讨论】:

    • 感谢您的评论。我很想有一个例外来说明哪条线。由于它是 XML,因此异常只能说明哪个节点有问题。我们需要的是 Scene Builder 中的 lint 工具(在您运行之前)。
    【解决方案2】:

    Scenic View

    Scenic View 是一个 JavaFX 应用程序,旨在简化 了解应用程序场景图的当前状态,并 还可以轻松操纵场景图的属性,而无需 继续编辑你的代码。这可以让您找到错误,并获得像素 完美,无需进行编译-检查-编译舞蹈。

    此演示文稿中有很好的 Scenic View 推荐和描述:

    更新 Scenic View 就像 JavaFX 应用程序的调试器或监视器一样工作。它不会帮助解决 FXML 加载程序问题,因为它会调查或监控 running 场景。我还发现最新版本 v1.3.0 在 Windows 7 和 Java 8 64 位上不稳定。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2021-02-27
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    相关资源
    最近更新 更多