我正在构建一个包含TabPane上的一些静态选项卡的JavaFX应用程序,并且在启动期间将根据需要动态添加具有不同内容的不同选项卡。
注意,每个动态选项卡可能彼此不同,我需要有选择地选择我要实例化/添加的这些动态选项卡中的哪一个。
我正在使用Scene Builder为大部分应用设计GUI。到目前为止,静态选项卡的一切工作正常。这是我的挑战开始的地方。
如何利用Scene Builder设计动态选项卡,并且只在运行时根据需要实例化这些选项卡?
谢谢Al
答案 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
。