我是 Fx 的新手。我有一个带有 10 个选项卡的 TabPanel。每个选项卡都有很多控件(图表、按钮等),我想要的是为每个选项卡分配一个控制器。SceneBuilder 只让我为整个视图分配一个控制器,我的意思是,只有顶部面板(根)具有“控制器类”选项,所以我必须为一个类中的所有选项卡编写代码,这个,如需要,导致一个非常大的类,难以理解和维护。也许解决方案非常简单,但正如我所说,我对 FX 的经验很少,而且我无法在网上找到类似的东西。
任何的想法?谢谢你。
我是 Fx 的新手。我有一个带有 10 个选项卡的 TabPanel。每个选项卡都有很多控件(图表、按钮等),我想要的是为每个选项卡分配一个控制器。SceneBuilder 只让我为整个视图分配一个控制器,我的意思是,只有顶部面板(根)具有“控制器类”选项,所以我必须为一个类中的所有选项卡编写代码,这个,如需要,导致一个非常大的类,难以理解和维护。也许解决方案非常简单,但正如我所说,我对 FX 的经验很少,而且我无法在网上找到类似的东西。
任何的想法?谢谢你。
一种方法是将每个标签页封装到一个单独的 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;
}
如果您有大量页面(每个页面都有大量自己的控件),另一种方法是将每个选项卡留空,一旦加载主视图,将相关页面加载到您的控件中。
您需要监听选项卡更改以切换内容并添加相关代码以加载/卸载用于选项卡页面内容的视图。
如果您发现性能问题,我建议从第一种方法开始并重构以使用第二种方法。