当我尝试使用我注入主控制器的控制器时,我总是得到一个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);
}
}
感谢您的帮助。
答案 0 :(得分:1)
您正在尝试访问构造函数中的注入字段,这显然不会起作用(因为FXMLLoader
在创建控制器之前无法注入任何内容,即在构造函数执行之后)。
将代码移至initialize()
方法:
public class MainController {
@FXML
private WidgetLineBelowTableController widgetlinebelowtableController;
public void initialize() {
widgetlinebelowtableController.setColor(255,0,0);
}
}
另外,请遵循标准naming conventions