JavaFX TabPane - 每个选项卡一个控制器

ron*_*ypc 28 controller javafx tabpanel

我是Fx的新手.我有一个带有10个标签的TabPanel.每个选项卡都有许多控件(图表,按钮等),我想要的是为每个选项卡分配一个控制器.SceneBuilder只让我为整个视图分配一个控制器,我的意思是,只有顶部面板(根)有"Controller类"选项,所以我必须为一个类中的所有选项卡编写代码,这样就像需要,导致一个非常大的类,难以理解和维护.也许解决方案非常简单,但正如我所说,我对FX的经验很少,而且我无法在网上找到类似的东西.

任何的想法?谢谢.

Ben*_*ale 76

一种方法是将每个标签页封装到一个单独的FXML文件中,该文件具有自己的关联控制器类.

然后在主要选项卡控件的FXML文件中,您可以执行以下操作:

<TabPane fx:controller="com.foo.MainController">
    <tabs>
        <Tab text="Untitled Tab 1">
            <content>
                <fx:include fx:id="fooTabPage" source="fooTabPage.fxml"/>
            </content>
        </Tab>
        <Tab text="Untitled Tab 2">
            <content>
                <fx:include fx:id="barTabPage" source="barTabPage.fxml"/>
            </content>
        </Tab>
    </tabs>
</TabPane>
Run Code Online (Sandbox Code Playgroud)

请注意,我没有直接嵌入内容,而是使用fx:include指令来指示FXMLLoader加载正在引用的FXML文件.用于页面内容的各个FXML文件都将拥有自己的控制器,以便逻辑很好地分离.

如果您需要与主控制器中的子页面或子控制器进行交互,那么您可以像使用任何其他FXML控件一样引用它们来注入它们.

public class MainController {
    // Inject tab content.
    @FXML private FooTabPage fooTabPage;
    // Inject controller
    @FXML private FooTabController fooTabPageController;

    // Inject tab content.
    @FXML private BarTabPage barTabPage;
    // Inject controller
    @FXML private BarTabController barTabPageController;
}
Run Code Online (Sandbox Code Playgroud)

如果您有大量页面(每个页面都有大量自己的控件),另一种方法是将每个选项卡留空,并在加载主视图后,将相关页面加载到您的控件中.

您需要侦听选项卡更改以切换内容并添加相关代码以加载/卸载用于选项卡页面内容的视图.

如果您发现性能问题,我建议从第一种方法开始,然后重构以使用第二种方法.

  • 请注意,此答案中选项卡内容的控制器的字段名称不正确; 要获取*controllers*注入(而不是选项卡内容本身),您需要`@FXML private FooTabController fooTabPageController;`(```Controller"`附加到include的`fx:id`).参见[docs](http://docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/introduction_to_fxml.html#nested_controllers). (4认同)