动态加载使用Scene Builder设计的选项卡

时间:2015-01-05 17:05:02

标签: tabs javafx

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

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

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

如何利用Scene Builder设计动态选项卡,并且只在运行时根据需要实例化这些选项卡?

谢谢Al

1 个答案:

答案 0 :(得分:3)

我会将每个标签的内容放入自己的FXML文件中。您可以加载始终加载到&#34; main&#34; FXML文件,使用<fx:include>。然后在主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>

MainController.java

public class MainController {

    @FXML
    private TabPane tabPane ;

    public void initialize() {
        Configuration config = readConfiguration(); // (pseudocode)
        if (config.shouldLoadTab1()) {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("DynamicTab1.fxml"));
            Tab tab = new Tab("Some title");
            tab.setContent(loader.load());
            tabPane.getTabs().add(tab);
        }
        // etc 
    }
}

每个选项卡的FXML文件(无论是&#34;静态&#34;或&#34;动态&#34;)都只包含选项卡的内容(而不是选项卡窗格,已在主要的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