JavaFX:从选项卡控制器添加新选项卡

JavaFX:从选项卡控制器添加新选项卡,java,javafx,tabs,javafx-8,Java,Javafx,Tabs,Javafx 8,我正试图使它,使我可以创建一个新的选项卡,我的选项卡窗格从另一个选项卡,但我有一些困难。目前,我在“main window.fxml”中设置了选项卡窗格,并使用相应的MainWindowController。我在这个选项卡窗格中有一个选项卡,它通过fx:include向场景图显示“mainTab.fxml”,由MainTabController控制。现在,在“mainTab”中,我希望有一个按钮能够向TabPane添加额外的选项卡,但由于这需要在“主窗口”中引用TabPane,因此我在“主窗口”

我正试图使它,使我可以创建一个新的选项卡,我的选项卡窗格从另一个选项卡,但我有一些困难。目前,我在“main window.fxml”中设置了选项卡窗格,并使用相应的MainWindowController。我在这个选项卡窗格中有一个选项卡,它通过fx:include向场景图显示“mainTab.fxml”,由MainTabController控制。现在,在“mainTab”中,我希望有一个按钮能够向TabPane添加额外的选项卡,但由于这需要在“主窗口”中引用TabPane,因此我在“主窗口”中创建了一个静态方法。当运行下面的代码时,我在MainWindowController的此行中得到一个NullPointerException:

mainTabPane.getTabs().add(new Tab(team.getTeamName()));
public class MainWindowController {

    @FXML
    private TabPane mainTabPane;

    public void createTeamTab(Team team) {
        mainTabPane.getTabs().add(new Tab(team.getTeamName()));

    }
}
有人能告诉我为什么会有这个例外,以及我如何开始解决这个问题吗

main-window.fxml:


mainTab.fxml(按钮的事件处理程序):

主窗口控制器:

mainTabPane.getTabs().add(new Tab(team.getTeamName()));
public class MainWindowController {

    @FXML
    private TabPane mainTabPane;

    public void createTeamTab(Team team) {
        mainTabPane.getTabs().add(new Tab(team.getTeamName()));

    }
}

您的代码无法工作,因为您没有在控制器上调用
createTeamTab(…)
:您正在创建的另一个
MainWindowController
实例上调用它。(加载FXML时,
FXMLLoader
会在控制器实例中初始化注释为
@FXML
的字段:由于相当明显的原因,它们不会在同一类的任意其他实例中设置为相同的值。)您需要获取对主选项卡使用的控制器的引用,并将其引用传递给主控制器

您没有告诉我们
mainTab.fxml
的控制器的类名:我假设它是
MainTabController
(所以只需将它更改为您实际使用的任何类名)

在主窗口控制器中执行以下操作:

public class MainWindowController {

    @FXML
    private TabPane mainTabPane;

    @FXML
    // fx:id of the fx:include with "Controller" appended
    private MainTabController mainWindowTabController ; 

    public void initialize() {
        mainWindowTabController.setMainWindowController(this);
    }

    public void createTeamTab(Team team) {
        mainTabPane.getTabs().add(new Tab(team.getTeamName()));

    }
}
然后在
MainTabController
do中

public class MainWindowController {

    private MainWindowController mainWindowController ;

    public void setMainWindowController(MainWindowController mainWindowController) {
        this.mainWindowController = mainWindowController ;
    }

    @FXML
    public void handleSubmit() {
        String teamName = teamNameTextField.getText();
        Roster roster = rosterComboBox.getValue();
        int startWeek = spinner.getValue();
        Team newTeam = new Team(teamName, startWeek, roster);
        TeamData.addTeam(newTeam);
        mainWindowController.createTeamTab(newTeam);

    }

}

因为这需要在“主窗口”中引用TabPane,所以我创建了一个静态方法:这没有什么意义。您已经确定了问题:您没有对控制器中主选项卡的选项卡窗格的引用。解决方案不是使任何东西成为静态的:解决方案是提供对
MainWindowController
实例的引用,以引用
MainTabController
。感谢您的响应。我可以向
MainTabController
提供一个
MainWindowController
的实例,然后从那里运行该方法,但仍然会得到相同的错误。抱歉,如果我在这里遗漏了一些明显的东西,但我对编程还是很陌生的!您的问题将显示该版本。(注意:您必须向
MainTabController
提供实际的控制器,而不仅仅是
MainWindowController
的任何实例)我创建了一个
MainWindowController
的实例,这就是它仍然不工作的原因。当您说“将实际控制器提供给
MainTabController
”是什么意思?感谢在
MainWindowController
initialize()
方法中,您可以执行类似于
mainWindowTabController.setWindowController(此)的操作,定义了明显的方法和字段。啊,是的,这正是我想要的解决方案。谢谢!我不认为我完全理解控制器是如何工作的,我必须引用实例而不是任何旧实例,但这就澄清了这一点!非常感谢