【问题标题】:Javafx FXML loader getcontroller returns nullJavafx FXML 加载器 getcontroller 返回 null
【发布时间】:2016-07-19 05:15:58
【问题描述】:

在我的程序中,我有一个 tabPane,每个选项卡都有自己的 FXML 文件和控制器。我已经为选项卡 2(调度程序)加载了 FXML 文件。我试图从我的子控制器(调度程序)中调用一个函数我的父控制器(FXML 文档)。当我使用 FXML Loader 加载控制器时,它返回一个空值。我该如何解决这个问题。

这是我的主要代码:

主 FXML 文档:

<AnchorPane xmlns:fx="http://javafx.com/fxml/1" fx:id="AnchorPane" prefHeight="600" prefWidth="800" xmlns="http://javafx.com/javafx/8.0.65"   fx:controller="showprojavafxml.FXMLDocumentController">
    <children>

【问题讨论】:

    标签: javafx fxml


    【解决方案1】:

    FXMLLoader 仅在加载 fxml 文件时实例化控制器(必须如此,因为控制器类在 fxml 文件中指定......)。由于您从未在加载程序上调用load(),因此永远不会创建控制器。

    您似乎通过两种不同的机制引用了 FXML 文件两次:一次在 FXMLDocumentController.initialize() 中,您创建一个位置设置为 fxml 文件的 FXMLLoader,一次在主 FXML 文档本身中,通过&lt;fx:include&gt;&lt;fx:include&gt; 导致 Scheduler.fxml 中定义的 UI 被显示;您在initialize() 方法中创建的FXMLLoader 不是(因为您从不调用load() 并显示结果)。

    要为包含的 fxml 引用控制器,请使用 "Nested controller" technique

    首先,将fx:id 添加到您的fx:include

    <Tab fx:id="tab2" text="Scheduler"   >
        <fx:include fx:id="scheduler" source="Scheduler.fxml" />
    </Tab>
    

    现在您可以将控制器注入到名称为 fx:id 的字段中,并附加文本 "Controller"

    public class FXMLDocumentController {
    
        @FXML
        private SchedulerController schedulerController ;
    
        @Override
        public void initialize(URL url, ResourceBundle rb) {
            schedulerController.refreshList();
        }
    
    }
    

    【讨论】:

    • 谢谢我已经让它能够从我的第二个控制器调用该函数,但它没有在我当前的屏幕上更新,但该函数正在运行。
    • 但是现在您正在调用load(),但您没有显示加载 FXML 时获得的 UI。控制器正在管理一个不可见的 UI。
    • 啊,您还有一个&lt;fx:include&gt;,它实际上正在显示 fxml。查看更新的答案。
    • 效果很好。谢谢队友
    猜你喜欢
    • 2014-06-21
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    相关资源
    最近更新 更多