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

32

我是Fx的新手。我有一个有10个选项卡的TabPanel。每个选项卡都有许多控件(图表、按钮等),我想为每个选项卡分配一个控制器。SceneBuilder只允许我为整个视图分配一个控制器类,我的意思是,只有顶部面板(根)有“Controller类”选项,因此我必须在一个类中编写所有选项卡的代码,这会导致一个非常大且难以理解和维护的类。

也许解决方案非常简单,但正如我所说,我对FX的经验很少,而且我没有在网上找到类似的东西。

有什么想法吗?谢谢。

1个回答

90

一种方法是将每个选项卡页面封装到一个单独的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>

注意,我没有直接嵌入内容,而是使用 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;
}
如果您有大量页面(每个页面都有许多自己的控件),另一种方法是保持每个选项卡为空,一旦加载主视图,就将相关页面加载到您的控件中。
您需要监听选项卡更改以切换内容,并添加相关代码以加载/卸载用于选项卡页面内容的视图。
如果发现性能问题,我建议从第一种方法开始重构为使用第二种方法。

感谢您的快速回复。我会开始使用您的解决方案。 - roneypc
没问题。如果您需要更多细节,请查看FXML参考文档 - Benjamin Gale
我认为这个解释得非常清楚,值得点赞。 - Ward
5
请注意,此答案中标签内容的控制器字段名称不正确;要获取控制器(而不是标签内容本身)注入您需要 @FXML private FooTabController fooTabPageController ; (fx:id后面添加了“Controller”)。请参见文档 - James_D
1
有人能提供fooTabPage.fxml的例子吗?它需要有fx:controller属性吗? - Rafaesp
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接