我是Fx的新手。我有一个有10个选项卡的TabPanel。每个选项卡都有许多控件(图表、按钮等),我想为每个选项卡分配一个控制器。SceneBuilder只允许我为整个视图分配一个控制器类,我的意思是,只有顶部面板(根)有“Controller类”选项,因此我必须在一个类中编写所有选项卡的代码,这会导致一个非常大且难以理解和维护的类。
也许解决方案非常简单,但正如我所说,我对FX的经验很少,而且我没有在网上找到类似的东西。
有什么想法吗?谢谢。
我是Fx的新手。我有一个有10个选项卡的TabPanel。每个选项卡都有许多控件(图表、按钮等),我想为每个选项卡分配一个控制器。SceneBuilder只允许我为整个视图分配一个控制器类,我的意思是,只有顶部面板(根)有“Controller类”选项,因此我必须在一个类中编写所有选项卡的代码,这会导致一个非常大且难以理解和维护的类。
也许解决方案非常简单,但正如我所说,我对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;
}
如果您有大量页面(每个页面都有许多自己的控件),另一种方法是保持每个选项卡为空,一旦加载主视图,就将相关页面加载到您的控件中。
@FXML private FooTabController fooTabPageController ;
(fx:id
后面添加了“Controller”)。请参见文档。 - James_D