【问题标题】:Java FXML Application: unsuccessful calling method in controller class from external classJava FXML应用程序:从外部类调用控制器类中的方法不成功
【发布时间】:2018-11-15 00:24:40
【问题描述】:

使用名为 EVIF VideoRouter 的 Java FXML 应用程序。主类为 VideoRouter.java,控制器类为 VideoRouterFXMLController.java。

我在 VideoRouterFXMLController.java 类中有一个方法,我需要能够从应用程序中的其他外部类调用该方法。基于广泛的搜索和阅读,我将主 VideoRouter.java 类中的 FXML 加载器代码更改为:

    FXMLLoader EVIFloader = new FXMLLoader(this.getClass().getResource("VideoRouterFXML.fxml"));
    Parent EVIFroot = (Parent) EVIFloader.load();
    VideoRouterFXMLController EVIFcontroller = EVIFloader.getController();

现在,据我了解这个过程,我应该以某种方式在 VideoRouter.java 主类中创建一个 getter,它返回我在上面创建的 EVIFcontroller 实例?然后我可以在其他类中使用该 getter 并在返回的实例中调用该方法?

如果是这样,我很难弄清楚吸气剂的确切放置位置。它进入控制器类还是主类?无论哪种情况,它似乎都无法看到控制器实例以返回它。

再次,我进行了广泛搜索,发现相关帖子似乎无法解决我遇到的这个特定问题。有什么帮助吗?

非常感谢!

【问题讨论】:

    标签: javafx fxml


    【解决方案1】:

    您已经部分回答了您的问题:在您的 VideoRouter 类中创建 VideoRouterFXMLController 成员变量和一个 getter 来公开它,然后在加载 FXML 后将其设置为控制器实例,就像代码 sn-p your提供。

    话虽如此,我会提出一种不同的方法来解决您的问题,因为由于您的类之间的高度耦合,这种方法通常不是一个好的设计。我会推荐 Observer pattern 作为替代方法,并推荐 EventBus 作为库来执行此操作。

    【讨论】:

    • 感谢您的建议,我会调查的。同时,在主类中我创建了一个变量“public static VideoRouterFXMLController EVIFcontroller;”在它的正下方是一个返回该值的公共静态方法。在上面共享的代码 sn-p 中,我更改了最后一行,因此公共变量是由 getController 填充的变量。在外部类中,我调用 VideoRouterFXMLController EVIFcontroller = VideoRouter.getMainController(); EVIFcontroller.populateRemoteSourcesPane();但是方法调用会抛出空指针异常。想法?再次感谢!
    • 你能检查你的方法调用(EVIFcontroller.populateRemoteSourcesPane())是在你设置控制器变量之前还是之后?另外,既然您通过 getter 公开它,为什么还要将其作为公共而不是私有的可访问性?
    • 你是对的,那应该是私有的;更正。剩下的事情我会尽快回复你,谢谢你的洞察力。
    • 宾果游戏。当我将其称为测试时,它被称为太早了。我将外部调用映射到 GUI 上的一个按钮,当我单击该按钮时,我似乎得到了正确的行为。谢谢!
    猜你喜欢
    • 2018-07-26
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多