Tabs 动态加载使用场景生成器设计的选项卡

Tabs 动态加载使用场景生成器设计的选项卡,tabs,javafx,Tabs,Javafx,我正在构建一个JavaFX应用程序,其中包含一个选项卡窗格上的几个静态选项卡,并且在启动期间,将根据需要根据配置动态添加具有不同内容的不同选项卡 注意,每个动态选项卡可能彼此不同,我需要有选择地选择要实例化/添加哪些动态选项卡 我正在使用Scene Builder为大部分应用程序设计GUI。到目前为止,静态选项卡的一切工作正常。这是我的挑战开始的地方 如何利用Scene Builder设计动态选项卡,并在运行时根据配置要求仅实例化这些选项卡 谢谢Al我会将每个选项卡的内容放入它自己的FXML文件

我正在构建一个JavaFX应用程序,其中包含一个选项卡窗格上的几个静态选项卡,并且在启动期间,将根据需要根据配置动态添加具有不同内容的不同选项卡

注意,每个动态选项卡可能彼此不同,我需要有选择地选择要实例化/添加哪些动态选项卡

我正在使用Scene Builder为大部分应用程序设计GUI。到目前为止,静态选项卡的一切工作正常。这是我的挑战开始的地方

如何利用Scene Builder设计动态选项卡,并在运行时根据配置要求仅实例化这些选项卡


谢谢Al

我会将每个选项卡的内容放入它自己的FXML文件中。您可以使用加载始终加载在“main”FXML文件中的文件。然后在主fxml控制器的
initialize()
方法中,读取配置并加载所需的其他fxml文件

差不多

Main.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.control.TabPane?>

<BorderPane xmlns:fx="http://javafx.com/fxml" fx:controller="MainController">
    <center>
        <TabPane fx:id="tabPane">
            <Tab>
               <fx:include source="StaticContent1.fxml"/>
            </Tab>
            <Tab>
               <fx:include source="StaticContent2.fxml"/>
            </Tab>
            <!-- etc -->
        </TabPane>
    </center>
</BorderPane>
每个选项卡的FXML文件(无论是“静态”还是“动态”)只包含选项卡的内容(而不是选项卡窗格,它已经在主FXML文件中定义,或者选项卡(我设置它的方式)是在主FXML中或由控制器定义的)。所以你会有类似的东西

StaticContent1.fxml

<?xml version=1.0 encoding="UTF-8"?>

<?import javafx.scene.layout.VBox?>

<VBox xmlns:fx="http://javafx.com.fxml">
    <!-- nodes... -->
</VBox>


显然,你可以使用任何你想要的布局窗格来代替
VBox

,那么问题是什么呢?我的文章可能还不清楚。我已经编辑过了。我已经创建了要在运行时动态添加的选项卡和控制器。我的挑战是在启动时只实例化我在FXML中调用的3个静态选项卡。我用SceneBuilder设计的FXML中已经有“n”个附加选项卡,我不希望在启动时创建这些选项卡。如上所述,在程序运行之后,当我解析配置文件时,我想选择要在alredy现有选项卡窗格上显示的动态选项卡之一。希望澄清。对不起。把前面的评论搞砸了。FXML文件中定义的任何内容在加载时都会被FXML加载程序实例化。您可能应该将每个选项卡的内容放在一个单独的FXML文件中。请参阅更新的答案。这看起来是一个赢家。我之前尝试过这个,但不知道创建独立选项卡FXML文件的最小组件层次结构是什么。根据你的例子,我需要一个1.)BoarderPane,2.)TabPane,然后是tab?我猜是什么让我困惑,因为我认为动态FXML文件中的TabPane会与我运行的程序中已经创建的主TabPane冲突。我所要做的就是将其他选项卡添加到现有的TabPane中,这样您的示例就可以完成这个任务了?对的谢谢艾尔
<?xml version=1.0 encoding="UTF-8"?>

<?import javafx.scene.layout.VBox?>

<VBox xmlns:fx="http://javafx.com.fxml">
    <!-- nodes... -->
</VBox>