【发布时间】:2019-09-18 10:27:57
【问题描述】:
我是TabPanes 的新手,直到现在才真正与他们合作,我需要一个TabPane 和许多Tabs 但每个Tab 的视图相同(相同的外观) ,改变它的只是标签中的数据。
我已阅读JavaFX TabPane - One controller for each tab 但这不是我想要的,分配一个控制器 foreach 选项卡。我不想重复我的代码,所以我只需要初始化一次包含我的视图的 .fxml 并在每次我在选项卡之间切换并将适当的数据加载到它时重用它。
我怎样才能实现它?
我的解决方案是:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.control.TabPane?>
<?import javafx.scene.control.Tab?>
<AnchorPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="tabpane.Controller">
<TabPane>
<Tab>
<fx:include source="CommonUI.fxml" fx:id="first"/>
</Tab>
<Tab>
<fx:include source="CommonUI.fxml" fx:id="second"/>
</Tab>
<Tab>
<fx:include source="CommonUI.fxml" fx:id="third"/>
</Tab>
<Tab>
<fx:include source="CommonUI.fxml" fx:id="forth"/>
</Tab>
<Tab>
<fx:include source="CommonUI.fxml" fx:id="fifth"/>
</Tab>
</TabPane>
</AnchorPane>
public class Controller implements Initializable {
MyService setrvice = MyServiceProvider.getService(MyService.class);
@FXML
private CommonUIController firstController;
@FXML
private CommonUIController secondController;
@FXML
private CommonUIController thirdController;
@FXML
private CommonUIController forthController;
@FXML
private CommonUIController fifthController;
@Override
public void initialize(URL location, ResourceBundle resources) {
// some code.
}
private void load() {
firstController.load(service.firstData());
secondController.load(service.secondData());
thirdController.load(service.thirdData());
forthController.load(service.forthData());
fifthController.load(service.fifthData());
}
}
【问题讨论】:
-
minimal reproducible example 请..你知道演习;)
-
嗯,没错 :) 我稍后会编辑它
-
您有多个具有相同视图但数据不同的选项卡,对吗?在这种情况下,您不希望每个选项卡都有单独的控制器 classes 是正确的;相反,您应该有一个控制器类,但该类的多个实例(每个选项卡一个)并使用不同的数据初始化每个实例。
-
@Slaw 是的,也许这就是要走的路。我想知道是否最好只有一个实例来处理所有事情,然后在选项卡切换时我只是替换数据。
-
虽然这样的实现可能是可能的,但您不应在同一视图的不同实例之间共享控制器实例,就像您不应在不同的 FXML 文件之间共享控制器类一样。从语义上讲,控制器实例“属于”单个视图实例。如果您担心在控制器之间共享状态,那么精心设计的模型就可以发挥作用了。