JavaFX:从选项卡控制器添加新选项卡
我正试图使它,使我可以创建一个新的选项卡,我的选项卡窗格从另一个选项卡,但我有一些困难。目前,我在“main window.fxml”中设置了选项卡窗格,并使用相应的MainWindowController。我在这个选项卡窗格中有一个选项卡,它通过fx:include向场景图显示“mainTab.fxml”,由MainTabController控制。现在,在“mainTab”中,我希望有一个按钮能够向TabPane添加额外的选项卡,但由于这需要在“主窗口”中引用TabPane,因此我在“主窗口”中创建了一个静态方法。当运行下面的代码时,我在MainWindowController的此行中得到一个NullPointerException:JavaFX:从选项卡控制器添加新选项卡,java,javafx,tabs,javafx-8,Java,Javafx,Tabs,Javafx 8,我正试图使它,使我可以创建一个新的选项卡,我的选项卡窗格从另一个选项卡,但我有一些困难。目前,我在“main window.fxml”中设置了选项卡窗格,并使用相应的MainWindowController。我在这个选项卡窗格中有一个选项卡,它通过fx:include向场景图显示“mainTab.fxml”,由MainTabController控制。现在,在“mainTab”中,我希望有一个按钮能够向TabPane添加额外的选项卡,但由于这需要在“主窗口”中引用TabPane,因此我在“主窗口”
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(此)的操作代码>,定义了明显的方法和字段。啊,是的,这正是我想要的解决方案。谢谢!我不认为我完全理解控制器是如何工作的,我必须引用实例而不是任何旧实例,但这就澄清了这一点!非常感谢