JavaFX TabPane - 多个控制器和多个 FXML 文件
JavaFX TabPane - More than one controller and more than one FXML file
我目前正在使用 JavaFXML 和场景生成器编写系统代码。我创建了一个登录页面,您可以在其中以管理员或员工身份登录。在 Admin 包中,我有 Admin.FXML 和 AdminController.
无论如何,我使用了 TabPane 并且我有五个选项卡,第一个名为 "customers" 并且它的所有实现(代码)都在 AdminController 中,因为它是 AnchorPane 的设置根控制器。
如您所想,在一个控制器中编写这五个选项卡的所有代码 class 会非常冗长。有没有办法让多个控制器 classes(每个选项卡一个)和一个 FXML 文件或多个 FXML 文件和控制器 classes 用于单个选项卡?
是的,这是可能的。您正在寻找的是神奇的 <fx:include>
标签。我有一个类似的选项卡式应用程序,我为每个选项卡编写了一个 FXML 和一个控制器,并将它们包含在两个地方,一次在 FXML 中,一次在主控制器代码中。我将在此处复制并粘贴我的示例。
主要 FXML:
<TabPane xmlns:fx="http://javafx.com/fxml"
fx:controller="my.package.MainController" fx:id="root">
<tabs>
<Tab text="First Tab">
<fx:include fx:id="firstTab" source="FirstModule.fxml"/>
</Tab>
<Tab text="Second Tab">
<fx:include fx:id="secondTab" source="SecondModule.fxml"/>
</Tab>
</tabs>
</TabPane>
主控制器:
public class MainController {
@FXML
private TabPane root;
@FXML
private FirstModuleController firstTabController;
@FXML
private SecondModuleController secondTabController;
// other code
}
这里要注意的一件事是,我通过使用 FXML 文件中给定的 fx:id
并在末尾添加了 Controller
一词来包含控制器本身。这指定您希望控制器与包含的 fxml 文件的根相关联,而不是根本身。例如,如果 FirstModule.fxml 的根是 VBox
,您可以通过键入 @FXML private VBox firstTab
来包含该根
我目前正在使用 JavaFXML 和场景生成器编写系统代码。我创建了一个登录页面,您可以在其中以管理员或员工身份登录。在 Admin 包中,我有 Admin.FXML 和 AdminController.
无论如何,我使用了 TabPane 并且我有五个选项卡,第一个名为 "customers" 并且它的所有实现(代码)都在 AdminController 中,因为它是 AnchorPane 的设置根控制器。
如您所想,在一个控制器中编写这五个选项卡的所有代码 class 会非常冗长。有没有办法让多个控制器 classes(每个选项卡一个)和一个 FXML 文件或多个 FXML 文件和控制器 classes 用于单个选项卡?
是的,这是可能的。您正在寻找的是神奇的 <fx:include>
标签。我有一个类似的选项卡式应用程序,我为每个选项卡编写了一个 FXML 和一个控制器,并将它们包含在两个地方,一次在 FXML 中,一次在主控制器代码中。我将在此处复制并粘贴我的示例。
主要 FXML:
<TabPane xmlns:fx="http://javafx.com/fxml"
fx:controller="my.package.MainController" fx:id="root">
<tabs>
<Tab text="First Tab">
<fx:include fx:id="firstTab" source="FirstModule.fxml"/>
</Tab>
<Tab text="Second Tab">
<fx:include fx:id="secondTab" source="SecondModule.fxml"/>
</Tab>
</tabs>
</TabPane>
主控制器:
public class MainController {
@FXML
private TabPane root;
@FXML
private FirstModuleController firstTabController;
@FXML
private SecondModuleController secondTabController;
// other code
}
这里要注意的一件事是,我通过使用 FXML 文件中给定的 fx:id
并在末尾添加了 Controller
一词来包含控制器本身。这指定您希望控制器与包含的 fxml 文件的根相关联,而不是根本身。例如,如果 FirstModule.fxml 的根是 VBox
,您可以通过键入 @FXML private VBox firstTab