寻求FXML / FXMLLoader错误诊断工具

时间:2014-06-03 06:27:33

标签: java javafx javafx-2 fxml diagnostics

概述

嗨,这是一个大纲用例。我有一个在 JavaFX Scene Builder 中开发的看似有效的FXML文件。它现在是一个非常重要的XML块,并且在FXML文件中的某处存在运行时加载错误。使用“预览”选项,Scene Builder可以正常工作。我有一个' 简单 .fxml'我用来验证控制器是否按预期工作,即相同的控件和事件,但没有额外的FXML布局。我已经和我正在进行剪切代码和测试循环以识别带有问题的XML。所以我会在某个时候深究这一点。

目前在Scene Builder和Netbeans FXML编辑器中都没有显示错误,并且我没有像#34; JavaFX - loading FXML file error"中那样出现错误;(#1 )。我得到的只是runnable中的最终任务的一个例外,它说加载器抛出异常。

目标(S)

发生这些错误。问题是 对FXML文件进行故障排除 可用或正在开发哪些工具?

一些想法,问题或选择:

  1. 这是一个错误吗?要记住作为装载机的黑盒子应该发出某种指示,如246行或#34; ......表明在哪里看的东西。
  2. 您有哪些技巧,技巧或建议可以更快地找到/解决此类错误?
    • 是否有使用Include
    • 的地方
  3. FXMLLoader类有什么钩子可以在错误崩溃之前捕获或捕获错误?
  4. 是否有任何记录或诊断FXMLLoader处理的工具?
  5. 有没有人写过可以这种方式使用的自定义FXMLLoader? (见#3)。
    • 我看到FXML使用SAX,是否可以包装或挂钩解析器并为FXMLLoader提供备用解析器?
  6. 是否有用于分析FXML和Java应用程序的静态工具 - 如 FXML Lint 或其他什么?
  7. 有关FXML如何处理的FXML加载,解析和运行时信息的深入分析。
  8. 是否存在或可能会在控制器中添加或注入一些额外的入口点以捕获FXML负载问题?
    • 例如,可以对控制器进行级联,以便我可以创建一个根控制器'这可能会捕捉到更接近原点的问题。
  9. 目前,只有在编辑人员看不到任何内容时,FXML中仅在加载时才会发现的问题非常耗时且难以预测。如果有人,我想看一些诊断工具

    进一步的见解

    这些是一些相关的' 调试'和' 疑难解答'在开发过程中出现的提示。也许其中一些可能会在某一天进入FXML验证器或Lint工具(?)这些点没有特定的顺序,它们的编号用于交叉引用。

    1. FXML 中的任何控制器标识符必须 存在,并使用@FXML在Java代码中进行注释。如果缺少注释,FXML将无法加载。
    2. 使用@FXML注释的每个Java名称都应该在FXML标记文件中。说一个名为" myLabel"的标签:如果代码中使用的myLabel会出现NullPointerException。与案例#1不同,文件将加载。
    3. 不要使用NetBeans" Compile on Save"使用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()是:" 需要的位置",针对#6中的错字。

    8. 如果您手动编辑FXML,请确保 所有相关组件。
    9. 请记住将FXML名称空间包含在" -d"文件,例如在最外面的XML元素上需要。

      <TreeView id="treeView" fx:id="tree" xmlns:fx="http://javafx.com/fxml" ... >
      
    10. 希望有所帮助。这些都是基于小型测试和试验的猜测。请修复关于实际工作方式的误解的嵌入式假设。

      另见

      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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

Scenic View

  

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

本演示文稿中有一个很好的推荐和描述:

<强>更新 Scenic View的工作方式类似于JavaFX应用程序的调试器或监视器。它无法解决FXML加载程序问题,因为它会调查或监视正在运行的场景。另外,我发现最新版本v1.3.0在Windows 7和64位Java 8上不稳定。