JavaFX选项卡窗格-多个控制器和多个FXML文件

JavaFX选项卡窗格-多个控制器和多个FXML文件,java,javafx,netbeans,fxml,scenebuilder,Java,Javafx,Netbeans,Fxml,Scenebuilder,我目前正在使用JavaFXML和scenebuilder编写一个系统。我已经创建了一个登录页面,您可以作为管理员或工作人员登录。在Admin包中,我有Admin.FXML和AdminController 无论如何,我使用了一个TabPane,我有五个选项卡,第一个名为“customers”,所有的实现(代码)都在AdminController中,因为它是AnchorPane的设置根控制器 正如您所想象的,在一个控制器类中编写这五个选项卡的所有代码将是非常冗长的。是否有一种方法可以让多个控制器类(

我目前正在使用JavaFXML和scenebuilder编写一个系统。我已经创建了一个登录页面,您可以作为管理员或工作人员登录。在Admin包中,我有Admin.FXML和AdminController

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


正如您所想象的,在一个控制器类中编写这五个选项卡的所有代码将是非常冗长的。是否有一种方法可以让多个控制器类(每个选项卡一个)和一个FXML文件,或者让单个选项卡有多个FXML文件和控制器类?

是的,这是可能的。你要找的是神奇的
标签。我有一个类似的选项卡式应用程序,我为每个选项卡编写了一个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>

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

来包含该根目录?请阅读,非常感谢您快速有效的回复。那么,我应该在Admin.FXML中包含fx:Include,还是创建一个完全不同的FXML文件并将其命名为Main?同样适用于控制器。您的主控制器中的内容将插入到我的AdminControlleries中,您的将是Admin.FXML和AdminController,而不是我的主控制器和MainController。我刚刚命名了我的Main,以尽可能保持它的通用性。javafx.fxml.LoadException:基本位置未定义。未知路径:javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2597)处的javafx.fxml.FXMLLoader.access$100(FXMLLoader.java:103)处的javafx.fxml.FXMLLoader$IncludeElement.constructValue(FXMLLoader.java:1122)处的javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:746)在javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)在javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2527)在javafx.fxml.FXMLLoader.load(FXMLLoader.java:2425)在javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2707)在JavaFXMLLoader.FXMLLoader
public class MainController {
    @FXML
    private TabPane root;
    @FXML
    private FirstModuleController firstTabController;
    @FXML
    private SecondModuleController secondTabController;

    // other code
}