JavaFX TabPane - 多个控制器和多个FXML文件

时间:2018-01-10 15:24:20

标签: java javafx netbeans fxml scenebuilder

我目前正在使用JavaFXML和场景构建器编写系统。我创建了一个登录页面,您可以在其中以管理员或员工身份登录。在Admin包中,我有Admin.FXML和AdminController。

无论如何,我使用了TabPane并且我有五个选项卡,第一个名为“customers”,所有实现(代码)都在AdminController中,因为它是AnchorPane的设置根控制器。

可以想象,在一个控制器类中编写这五个选项卡的所有代码将非常漫长。有没有办法让单个选项卡有多个Controller类(每个选项卡一个)和一个FXML文件或多个FXML文件和控制器类?

1 个答案:

答案 0 :(得分:1)

是的,有可能。您正在寻找的是神奇的<fx:include>标签。我有一个类似的选项卡式应用程序,我为每个选项卡编写了一个FXML和一个控制器,并将它们包含在两个位置,一次在FXML中,一次在主控制器代码中。我会在这里复制并粘贴我的例子。

主要FXML:

<TabPane xmlns:fx="http://javafx.com/fxml"
fx:controller="my.package.MainController" fx:id="root">
    <tabs>
        <Tab text="First Tab">
            <fx:include fx:id="firstTab" source="FirstModule.fxml"/>
        </Tab>
        <Tab text="Second Tab">
            <fx:include fx:id="secondTab" source="SecondModule.fxml"/>
        </Tab>
    </tabs>
</TabPane>

主控制器:

public class MainController {
    @FXML
    private TabPane root;
    @FXML
    private FirstModuleController firstTabController;
    @FXML
    private SecondModuleController secondTabController;

    // other code
}

这里需要注意的一点是,我通过使用FXML文件中给定的fx:id来包含控制器本身,并在末尾添加了单词Controller。这指定您希望控制器与包含的fxml文件的根相关联,而不是根本身。例如,如果您的FirstModule.fxml的根目录是VBox,则可以通过键入@FXML private VBox firstTab

来包含该根目录