JavaFX:从选项卡控制器

时间:2017-05-22 11:38:55

标签: java javafx tabs javafx-8

我试图让我可以从另一个标签中为我的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()));

    }
}

1 个答案:

答案 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);

    }

}