Javafx注入控制器为空

时间:2016-03-03 16:01:38

标签: javafx

当我尝试使用我注入主控制器的控制器时,我总是得到一个Nullpointer异常(widgetlinebelowtableController为null)。我已经看到了这个答案,但没有帮助:JavaFX controller injection does not work

注入fxml:

    <HBox fx:id="widgetLineBelowTable" maxWidth="Infinity" spacing="5.0"   xmlns="http://javafx.com/javafx/null" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.widgets.WidgetLineBelowTableController">
        <padding>
            <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
        </padding>
        <Label fx:id="warningLabel" text="Overflow"/>
   </HBox>

此fxml的控制器:

public class WidgetLineBelowTableController
    {
    @FXML
    Label warningLabel;

    public void setColor(int r, int g, int b) {
        warningLabel.setTextFill(Color.rgb(r,g,b));
    }

}

我的主要fxml:

<VBox xmlns="http://javafx.com/javafx/null" xmlns:fx="http://javafx.com/fxml/1" stylesheets="/sample/style.css" fx:controller="sample.mainController">
    <fx:include source="/sample/menubar/MenuBar.fxml"/>
    <TabPane>

        <tabs>
            <Tab closable="false" text="FirstTab">
                <VBox>
                    <TitledPane collapsible="false">
                        <text>Results</text>
                        <fx:include source="table/Table.fxml"/>
                    </TitledPane>
                    <fx:include fx:id="widgetlinebelowtable" source="widgets/WidgetLineBelowTable.fxml" />
                </VBox>
            </Tab>
            <Tab closable="false" text="SecondTab">

            </Tab>
        </tabs>
    </TabPane>
</VBox>

主控制器:

import sample.widgets.WidgetLineBelowTableController;

public class mainController {

    @FXML
    private WidgetLineBelowTableController widgetlinebelowtableController;

    public mainController() {
        widgetlinebelowtableController.setColor(255,0,0);
    }

}

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您正在尝试访问构造函数中的注入字段,这显然不会起作用(因为FXMLLoader在创建控制器之前无法注入任何内容,即在构造函数执行之后)。

将代码移至initialize()方法:

public class MainController {

    @FXML
    private WidgetLineBelowTableController widgetlinebelowtableController;

    public void initialize() {
        widgetlinebelowtableController.setColor(255,0,0);
    }

}

另外,请遵循标准naming conventions