【问题标题】:JavaFx TabPane One view for each tab but different dataJavaFx TabPane 每个选项卡有一个视图,但数据不同
【发布时间】: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 文件之间共享控制器类一样。从语义上讲,控制器实例“属于”单个视图实例。如果您担心在控制器之间共享状态,那么精心设计的模型就可以发挥作用了。

标签: javafx tabs javafx-8 fxml


【解决方案1】:

创建控制器实例并获取视图组件。然后在选项卡更改时替换视图和更新数据。

//pseudoCode
Node controllerView  = controller.getView();

TabPane tabPane = new TabPane();
tabPane.getSelectionModel().selectedItemProperty().addListener((observable, oldTab, tab) -> {
    if(oldTab != null) {
        oldTab.setContent(null);
    }
    if(tab != null) {
        tab.setContent(controllerView);
        //pseudoCode
        controller.updateData();
    }
});

【讨论】:

    猜你喜欢
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    • 2017-01-28
    • 2013-01-02
    • 2015-10-18
    相关资源
    最近更新 更多