控制器JavaFX中的HelloWorld返回null(Controller returning n

2019-10-18 13:35发布

所以,我当然在创造一个简单的例子,直线跳水。

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

我读过https://forums.oracle.com/thread/2317621 ,我知道上面anchorpane需要指向我在FXML控制器。

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"      minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns:fx="http://javafx.com/fxml" fx:controller="mypackage.Controller">
  <children>

并显示正常,但断言捕获因为没有电脑板!
另外, initialize()并实际运行,这意味着将创建以下控制器!

public class Controller {

@FXML
private Label label ;

public Label getLabel()
{
    return label ;
}

@FXML
public void initialize()
{
    System.out.println("Swear a lot!");
    System.out.println(label);
}
}

一个注记FX开发者,如果你正在看这个:

如果你要在一个XML文件指向弱耦合串班,我真的很期待.load()抛出一个有意义的运行时异常,如果它不能找到什么它寻找。 没有任何借口永远返回null ...最好采取页从GWT部件团队,并有一个预编译失败之前,你的程序实际上开杆,还是最好的尚未插件流行的IDE。

此外,你真的应该使您能够轻松获得源代码为JavaFX运行起来(把它放在行家)JavaFX的,所以它可以自动下载和我可以计算出的问题是自己是什么。 太难。

我敢肯定有一些简单的我做错了,但这些工具应该救我脱离这一点。

Answer 1:

为了能够获得控制类这样

Controller controller = loader.<Controller>getController();

你需要调用实例化FXMLLoader,即加载方法
代替

Parent root = loader.load(bla);

当负载()是静态这里,通话

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

但我同意应该有据可查。



Answer 2:

Uluk的回答已经解决了这个问题提出的主要问题。

这个“答案”只有解决了配套的问题。

我真正期待的.load()抛出一个有意义的运行时异常,如果它不能找到什么它寻找。

在登录一个调整问题的JavaFX问题跟踪的API的变化,异常信息修改或文档改进请求。 在这种情况下,它听起来就像是一个文档和API的使用说明。

还要注意的是使用FXML文件是可选的。 可在FXML来所做的一切,也可以在Java API中直接完成,所以你并不需要“有弱耦合串在一个XML文件指向类”。

在你确实有这个弱耦合的字符串,某些开发环境中,如例理念12.1+ ,将运行增量确认,检查错误语法高亮和你FXML /代码导航。 所以,目前的工具可以帮助您节省从一些缺陷在一定程度上(尽管可能不是在您的文章中引用的特定问题)。 Java框架已与XML集成在IDE中很长一段时间,它不是一个完美的婚姻,但IDE开发者已经成为解决一些最严重的痛点的相当娴熟。

此外,你真的应该使您能够轻松获得源代码为JavaFX运行起来(把它放在行家)JavaFX的,所以它可以自动下载和我可以计算出的问题是自己是什么。

在JavaFX的问题跟踪器,有JavaFX的源代码与JDK捆绑现有请求 。 这个问题定于它的发布前对Java 8中实现。 该解决方案并不适用于早期的JavaFX版本如2.2 JavaFX的那些版本大多是封闭源代码。

在此期间,你可能有兴趣在从开放JFX库,这是在回答提出的获取源代码的替代解决方案: JavaFX的源代码没有显示 。

我没有看OpenJDK的,但它看起来像一个使命。

可以理解的 - 使用源从开JFX库是更复杂的比具有所包含与由新的IDE项目自动参考的JDK分布(以同样的方式,目前JDK src.zip所使用的IDE捆绑src.zip )。

我相信JavaFX的来源与主要IDE方便地访问了JavaFX源捆绑会由Java 8发布的时间来实现。

我不认为放置JavaFX库和代码在Maven仓库是一个很好的解决方案,现在自己的JDK形成分布的一部分的库。 在JDK发行的其他代码不包括在Maven仓库。 或许是受到时间的Java 9采用了模块化JDK的方法,恶有恶报,这可能会改变。

除非场景Builder可以创建/修改Java代码,您不使用XML的建议是不凄美。

不使用FXML不是一个建议 - 它只是为那些谁可能不喜欢与相匹配的强类型的Java语言每周键入字符串的语言的基于XML的方法替代。

我曾经做出关于FXML使用的唯一真正的建议是不要使用FXML和SceneBuilder当你第一次启动的JavaFX发展(IMO):

  1. 这是更有效的学习工具的JavaFX的原则时,只使用API​​。
  2. 有少学的东西。
  3. 您没有GUI工具自动生成,你可能还不知道如何正确地使用复杂的UI元素。
  4. 你不必担心不良记录FXML装载机怎么有点复杂,混乱和工作。
  5. 你不必担心在FXML文件和Java代码UI元素之间的同步映射一致。
  6. 你不得不了解的布局和场景图结构从低层次的API的角度。

如果你正在评估UI技术特别允许的关注点分离,使布局设计者可能加盟的球队......那么你的关注列表是相当静音

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

提供了新的JavaFX开发者的理由只使用API​​不是真正关注执行初始JavaFX开发。 它们构成了我对为什么开发人员(不跨功能评估)可能只是坚持的API仅在最初学习的JavaFX技术意见。

我不认为这是错误的,使这个文档问题,因为它需要太多的用户。

这是可以理解的情绪。 也许自嘲静态FXMLLoader负荷的方法可能是防止在首位这种用户错误的可能性更好的方法。

无论如何,最直接的方式来请求更改为文档或执行是建立在发布请求的JavaFX问题跟踪 ,并与开发商讨论这个问题的OpenJFX-dev邮件列表 。 JavaFX是目前正在积极开发中,所以这样的要求(如果及时作出)具有在Java 8时间表正在实施一个合理的机会。

如果您还有其他问题的辅助,我建议他们张贴到最好的处理这些问题类型(如论坛甲骨文的JavaFX论坛或的OpenJFX-dev的JavaFX的邮件列表 )。



文章来源: Controller returning null in javafx helloworld
标签: javafx-2 fxml