【问题标题】:JavaFX TabPane - One controller for each tabJavaFX TabPane - 每个选项卡一个控制器
【发布时间】:2013-11-22 06:46:46
【问题描述】:

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

有什么想法吗?谢谢。

【问题讨论】:

    标签: controller javafx tabpanel


    【解决方案1】:

    一种方法是将每个标签页封装到一个单独的 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;
    }
    

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

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

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

    【讨论】:

    • 感谢您的快速回复。我将着手处理您的解决方案。
    • 没问题。如果您需要更多详细信息,请查看FXML reference
    • 请选择此作为答案。我认为它解释得很好,值得支持
    • 请注意,此答案中选项卡内容的控制器字段名称不正确;要获得 controllers 注入(而不是选项卡内容本身),您需要 @FXML private FooTabController fooTabPageController ;"Controller" 附加到包含的 fx:id)。见docs
    • 谁能提供 fooTabPage.fxml 的例子?它需要有一个 fx:controller 属性吗?
    猜你喜欢
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2017-01-28
    • 2013-01-02
    相关资源
    最近更新 更多