我试图让我可以从另一个标签中为我的TabPane创建一个新选项卡,但我遇到了一些困难。目前我在“main-window.fxml”中设置了TabPane,并带有相应的MainWindowController。我在这个TabPane中有一个标签,通过fx:include,在MainTabController控制的场景图中显示“mainTab.fxml”。现在从“mainTab”中我想要一个按钮,以便能够向TabPane添加一个额外的选项卡,但由于这需要在“主窗口”中引用TabPane,因此我在“main- window”中创建了一个静态方法窗口”。当运行下面的代码时,我在MainWindowController的这一行得到一个NullPointerException:
mainTabPane.getTabs().add(new Tab(team.getTeamName()));
有人可以告诉我为什么它会给出这个例外以及我如何开始解决它?
主window.fxml:
<TabPane fx:id="mainTabPane">
<tabs>
<Tab fx:id="mainTab" text="Main" closable="false">
<fx:include source="mainTab.fxml" fx:id="mainWindowTab" alignment="CENTER"/>
</Tab>
</tabs>
</TabPane>
mainTab.fxml(按钮的事件处理程序):
@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 controller = new MainWindowController();
controller.createTeamTab(newTeam);
}
MainWindowController:
public class MainWindowController {
@FXML
private TabPane mainTabPane;
public void createTeamTab(Team team) {
mainTabPane.getTabs().add(new Tab(team.getTeamName()));
}
}
答案 0 :(得分:1)
您的代码无法正常工作,因为您没有在控制器上调用createTeamTab(...)
:您在另一个MainWindowController
的实例上调用它。 (注释@FXML
的字段在加载FXML时由FXMLLoader
在控制器实例中初始化:出于相当明显的原因,它们不会在同一类的任意其他实例中设置为相同的值。 )您需要获取对主选项卡使用的控制器的引用,并将引用传递给主控制器。
您没有告诉我们mainTab.fxml
控制器的类名:我将假设它是MainTabController
(所以只需将其更改为您实际使用的任何类名)。
在MainWindowController
中,执行:
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
做
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);
}
}