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

JavaFX TabPane - More than one controller and more than one FXML file

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

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

如您所想,在一个控制器中编写这五个选项卡的所有代码 class 会非常冗长。有没有办法让多个控制器 classes(每个选项卡一个)和一个 FXML 文件或多个 FXML 文件和控制器 classes 用于单个选项卡?

是的,这是可能的。您正在寻找的是神奇的 <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

来包含该根