我正在尝试使用JavaFX使用Java构建我的第一个“真实”应用程序。我正在使用FXML来设计整个程序,因此我决定将某些部分分成不同的.fxml
文件,并将它们链接到不同的控制器。我正在使用一个链接到MainController
的{{1}},在main.fxml
中,我使用main.fxml
调用了其他一些fxml文件。所有包括的都有自己的控制器。
问题是控制器不能独立运行100%,有时您想按链接到一个控制器的按钮,然后将其传递给另一个控制器。我有一个可行的解决方案,但是我不确定这是否是最好的方法。
我的解决方案是:有一个抽象的fx:include
类,该类为每个子控制器保护了静态字段。初始化后,SubController
用从MainController
获取的控制器类填充所有这些字段,以及main.fxml
本身的一个字段。每个子控制器都继承自MainController
,以便他们可以访问静态字段并调用其他控制器的公共方法。
SubController
public abstract class SubController implements Initializable {
protected static MainController mainController;
protected static MenuBarController menuBarController;
protected static VideoPanelController videoPanelController;
public static void setMainController(MainController mainController) {
SubController.mainController = mainController;
}
public static void setMenuBarController(MenuBarController menuBarController) {
SubController.menuBarController = menuBarController;
}
public static void setVideoPanelController(VideoPanelController videoPanelController) {
SubController.videoPanelController = videoPanelController;
}
}
这样,当在菜单栏中单击按钮时,它可以使用视频面板控制器的公共方法:
public class MainController implements Initializable {
@FXML private MenuBarController menuBarController;
@FXML private VideoPanelController videoPanelController;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
SubController.setMainController(this);
SubController.setMenuBarController(menuBarController);
SubController.setVideoPanelController(videoPanelController);
}
这很好,但是我仍然觉得可能有一种更简单的方法。这是个好方法吗?如果没有,我还应该怎么做?