Javafx 2 javafx helloworld中返回null的控制器

Javafx 2 javafx helloworld中返回null的控制器,javafx-2,fxml,Javafx 2,Fxml,当然,我会直接开始创建一个简单的示例 public class Main extends Application { URL bla = getClass().getResource("/sample.fxml"); @Override public void start(Stage primaryStage) throws Exception{ //If you get weird errors: http://zenjava.com/javafx/maven/fix-classp

当然,我会直接开始创建一个简单的示例

public class Main extends Application {

URL bla = getClass().getResource("/sample.fxml");

@Override
public void start(Stage primaryStage) throws Exception{
    //If you get weird errors: http://zenjava.com/javafx/maven/fix-classpath.html
        //but not actually my issue. Example displays fine in intellij.

    try {

        FXMLLoader loader = new FXMLLoader(bla);
        Parent root = loader.load(bla);

        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();

        Controller controller = loader.<Controller>getController() ;
        assert(controller != null);
        controller.getLabel().setText("Kaboom!");
    } catch (Exception e) {
        // Exception gets thrown if the fxml file could not be loaded
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    launch(args);
}
}
如果您正在观看以下内容,请向FX开发人员发出提示:

如果在xml文件中有指向类的弱耦合字符串,我真的希望.load在找不到所需内容时抛出一个有意义的运行时异常。没有理由永远返回空值。。。理想情况下,从GWT widget团队获得一个页面,在程序实际运行之前让预编译程序失败,或者为流行的IDE提供最好的插件

此外,您真的应该尽快启动JavaFX的源代码,并将其放入maven for JavaFX中运行,这样它就可以自动下载,我可以自己解决问题。太难了


我肯定有一些简单的事情我做错了,但是这些工具应该可以帮我避免这种情况。

这样才能得到控制器类

Controller controller = loader.<Controller>getController();
如果此处的负载是静态的,请调用

Parent root = (Parent) loader.load(bla.openStream());

但是我同意应该有很好的文档记录。

这样才能得到控制器类

Controller controller = loader.<Controller>getController();
如果此处的负载是静态的,请调用

Parent root = (Parent) loader.load(bla.openStream());
但我同意应该有很好的记录。

乌鲁克的回答已经解决了问题中提出的主要问题

此答案仅针对辅助问题

如果.load找不到它要查找的内容,我真的希望它抛出一个有意义的运行时异常

在中记录调整问题,以获取API更改、异常消息修改或文档改进请求。在本例中,它听起来像是一个文档和API使用说明

还请注意,FXML文件的使用是可选的。在FXML中可以完成的所有事情也可以直接在JavaAPI中完成,因此不需要在指向类的xml文件中使用弱耦合字符串

在存在这种弱字符串耦合的情况下,某些开发环境(例如)将为您运行增量验证、检查、错误语法突出显示和fxml/代码导航。因此,当前的工具可以在一定程度上帮助您避免一些陷阱,尽管可能不适用于您文章中提到的特定问题。Java框架在IDE中与XML集成已有很长一段时间了,这并不是完美的结合,但IDE开发人员已经非常擅长解决一些最糟糕的问题

此外,您真的应该尽快启动JavaFX的源代码,并将其放入maven for JavaFX中运行,这样它就可以自动下载,我可以自己解决问题

在JavaFX问题跟踪器中,有。这个问题计划在Java8发布之前实现。该解决方案不适用于早期的JavaFX版本,如JavaFX2.2,因为这些版本大多是封闭源代码的

同时,您可能对从开放jfx存储库获取源代码的替代解决方案感兴趣,该解决方案在以下内容的答案中提供:

我确实看过openJDK,但它看起来像一个任务

可以理解-使用开放jfx存储库中的源代码比使用JDK发行版中包含的捆绑src.zip更为复杂,新IDE项目会自动引用它,就像当前的JDK src.zip被IDE使用一样

我确信JavaFX源代码绑定和从主要IDE轻松访问JavaFX源代码将在Java8发布时实现

我不认为将JavaFX库和代码放在maven存储库中是一个好的解决方案,因为库本身现在已经成为JDK发行版的一部分。JDK发行版中的其他代码不包含在maven存储库中。也许当Java9采用模块化JDK方法时,这种情况可能会改变


除非场景生成器可以创建/修改java代码,否则您不使用xml的建议并不尖锐

不使用FXML并不是一个建议——对于那些可能不喜欢基于XML的方法(将每周类型的字符串语言与强类型的Java语言相匹配)的人来说,这只是一个选择

关于FXML的使用,我唯一真正的建议是,当您作为IMO首次启动JavaFX开发时,不要使用FXML和SceneBuilder:

在学习JavaFXToolkit的原理时,只使用API更有效。 要学的东西少了。 您没有GUI工具自动生成复杂的UI元素,您可能还不知道如何正确使用这些元素。 您不必担心FXML加载器的工作有多么复杂、混乱和缺乏文档记录。 您不必担心FXML文件和Java代码中的UI元素之间保持同步映射。 您必须从低级API的角度理解布局和场景图结构。
如果您正在评估UI技术,特别是允许分离关注点,以便布局设计师可以加入团队…那么 你的担忧清单很简单

当然,从跨职能团队的角度对JavaFX技术的任何评估都自然涉及对FXML和SceneBuilder使用的评估

为新的JavaFX开发人员提供的仅使用API执行初始JavaFX开发的理由并不真正令人担忧。它们构成了我的观点,即为什么开发人员(而不是跨功能的评估人员)只有在最初学习JavaFX技术时才会坚持使用API

我不认为将此作为文档问题是错误的,因为它对用户的期望太高了

这是可以理解的。首先,也许不推荐静态FXMLLoader加载方法可能是防止此类用户错误发生的更好方法

无论如何,请求对文档或实现进行更改的最直接方法是在中创建问题请求,并在上与开发人员讨论问题。JavaFX目前正在积极开发中,因此如果及时提出这样的请求,就有可能在java8时间段内实现

如果您还有其他的辅助问题,我建议您将它们发布到论坛上,这些论坛可以最好地处理这些问题类型,如或。

Uluk的回答已经解决了问题中提出的主要问题

此答案仅针对辅助问题

如果.load找不到它要查找的内容,我真的希望它抛出一个有意义的运行时异常

在中记录调整问题,以获取API更改、异常消息修改或文档改进请求。在本例中,它听起来像是一个文档和API使用说明

还请注意,FXML文件的使用是可选的。在FXML中可以完成的所有事情也可以直接在JavaAPI中完成,因此不需要在指向类的xml文件中使用弱耦合字符串

在存在这种弱字符串耦合的情况下,某些开发环境(例如)将为您运行增量验证、检查、错误语法突出显示和fxml/代码导航。因此,当前的工具可以在一定程度上帮助您避免一些陷阱,尽管可能不适用于您文章中提到的特定问题。Java框架在IDE中与XML集成已有很长一段时间了,这并不是完美的结合,但IDE开发人员已经非常擅长解决一些最糟糕的问题

此外,您真的应该尽快启动JavaFX的源代码,并将其放入maven for JavaFX中运行,这样它就可以自动下载,我可以自己解决问题

在JavaFX问题跟踪器中,有。这个问题计划在Java8发布之前实现。该解决方案不适用于早期的JavaFX版本,如JavaFX2.2,因为这些版本大多是封闭源代码的

同时,您可能对从开放jfx存储库获取源代码的替代解决方案感兴趣,该解决方案在以下内容的答案中提供:

我确实看过openJDK,但它看起来像一个任务

可以理解-使用开放jfx存储库中的源代码比使用JDK发行版中包含的捆绑src.zip更为复杂,新IDE项目会自动引用它,就像当前的JDK src.zip被IDE使用一样

我确信JavaFX源代码绑定和从主要IDE轻松访问JavaFX源代码将在Java8发布时实现

我不认为将JavaFX库和代码放在maven存储库中是一个好的解决方案,因为库本身现在已经成为JDK发行版的一部分。JDK发行版中的其他代码不包含在maven存储库中。也许当Java9采用模块化JDK方法时,这种情况可能会改变


除非场景生成器可以创建/修改java代码,否则您不使用xml的建议并不尖锐

不使用FXML并不是一个建议——对于那些可能不喜欢基于XML的方法(将每周类型的字符串语言与强类型的Java语言相匹配)的人来说,这只是一个选择

关于FXML的使用,我唯一真正的建议是,当您作为IMO首次启动JavaFX开发时,不要使用FXML和SceneBuilder:

在学习JavaFXToolkit的原理时,只使用API更有效。 要学的东西少了。 您没有GUI工具自动生成复杂的UI元素,您可能还不知道如何正确使用这些元素。 您不必担心FXML加载器的工作有多么复杂、混乱和缺乏文档记录。 您不必担心FXML文件和Java代码中的UI元素之间保持同步映射。 您必须从低级API的角度理解布局和场景图结构。
如果您正在评估UI技术 特别是允许分离关注点,以便布局设计师可以加入团队……那么您的关注点列表就相当安静了

当然,从跨职能团队的角度对JavaFX技术的任何评估都自然涉及对FXML和SceneBuilder使用的评估

为新的JavaFX开发人员提供的仅使用API执行初始JavaFX开发的理由并不真正令人担忧。它们构成了我的观点,即为什么开发人员(而不是跨功能的评估人员)只有在最初学习JavaFX技术时才会坚持使用API

我不认为将此作为文档问题是错误的,因为它对用户的期望太高了

这是可以理解的。首先,也许不推荐静态FXMLLoader加载方法可能是防止此类用户错误发生的更好方法

无论如何,请求对文档或实现进行更改的最直接方法是在中创建问题请求,并在上与开发人员讨论问题。JavaFX目前正在积极开发中,因此如果及时提出这样的请求,就有可能在java8时间段内实现


如果您还有其他的辅助问题,我建议您将它们发布到论坛上,这些论坛可以最好地处理这些问题类型,如或。

Thanx!尽管intellij用斜体表示字体,但根本不清楚是否存在使人困惑的静态字符。事实上,我确实看到一些示例在流中穿行,但当我使用bla.openStream时,它给了我一个错误,我错误地认为这是一个错误的参数。答案是将loader.load强制转换为Parent。您应该更新您的答案以更正此错误。Thanx!尽管intellij用斜体表示字体,但根本不清楚是否存在使人困惑的静态字符。事实上,我确实看到一些示例在流中穿行,但当我使用bla.openStream时,它给了我一个错误,我错误地认为这是一个错误的参数。答案是将loader.load强制转换为Parent。除非Scene Builder可以创建/修改java代码,否则不使用xml的建议并不尖锐。我认为将此作为文档问题是错误的,因为它对用户的期望过高。在什么情况下返回null是个好主意?如果没有,它应该抛出一个错误,让他们知道哪里出了问题,并建议他们可能混淆了静态和非静态方法。像我这样的Java程序员被maven宠坏了,最近切换到intellij,我甚至不知道在哪里导入代码。。。80%的时间是自动发生的。。。就像在其他工具包中一样。我正在运行12.1 idea。更新答案以解决其他问题。如果您专门评估UI技术以允许分离问题,以便布局设计师可以加入团队。。。曾经使用过诸如DevExpress、Gwt widgets、Swing、SWT、WindowBuilder designer的最后3款、wxWidgets和Qt等技术,以及游戏工具包PlayN上的TriplePlay UI。。。然后,您的关注点列表是相当安静的,因为您希望尽快了解它的效果,以便进行评估。我的问题不应该成为绊脚石。如果可行的话,用户的关注应该先于实现者的关注……但我还是投票支持你的答案,感谢你所付出的努力:-除非场景生成器可以创建/修改java代码,否则你不使用xml的建议并不尖锐。我认为将此作为文档问题是错误的,因为它对用户的期望过高。在什么情况下返回null是个好主意?如果没有,它应该抛出一个错误,让他们知道哪里出了问题,并建议他们可能混淆了静态和非静态方法。像我这样的Java程序员被maven宠坏了,最近切换到intellij,我甚至不知道在哪里导入代码。。。80%的时间是自动发生的。。。就像在其他工具包中一样。我正在运行12.1 idea。更新答案以解决其他问题。如果您专门评估UI技术以允许分离问题,以便布局设计师可以加入团队。。。曾经使用过诸如DevExpress、Gwt widgets、Swing、SWT、WindowBuilder designer的最后3款、wxWidgets和Qt等技术,以及游戏工具包PlayN上的TriplePlay UI。。。然后,您的关注点列表是相当安静的,因为您希望尽快了解它的效果,以便进行评估。我的问题不应该成为绊脚石。如果可行的话,用户的担忧应该优先于实施者的担忧……但我还是对你的答案投了赞成票,感谢你付出的努力:-
Parent root = (Parent) loader.load(bla.openStream());