使用Scene Builder在JavaFX中创建MVC模式

我是JavaFX的新手,并且在我目前的设置下努力创建一个合适的MVC架构。 我使用Scene Builder将UI单击在一起,并指定了一个Controller类。

启动:

public class Portal extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("PortalUI.fxml")); stage.setTitle("Portal"); stage.setScene(new Scene(root)); stage.show(); } } 

Controller类包含其余代码。

 public class AccommodationPortalView implements Initializable { @Override public void initialize(URL url, ResourceBundle resources) { // Work here. } } 

我的教授要求我进一步分离这个申请的关注点和责任。 Controller不仅可以管理状态并与后端通信,还可以更新View。

我的第一个回应是让Controller类成为View并为Controller和Model创建另外两个类。

但是,我对如何连接这些部件感到茫然。 我从不需要实例化View,因此没有可以传递给Controller的View实例。 接下来,我尝试将它们全部制作成单例并简单地让Controller在运行时获取它们,但这给了我一个错误。

 public class Portal extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("PortalUI.fxml")); stage.setTitle("Portal"); stage.setScene(new Scene(root)); stage.show(); // Controller gets a View and Model instance in initialize(); // Error: Instantiation and Runtime Exception... PortalController.INSTANCE.initialize(); } } 

如何使用当前配置正确设置MVC模式? 是否需要不同的架构?

您的,
View是JavaFX平台在启动时提供的主要Stage 。 此阶段具有唯一的Scene (您已创建并设置),而该Scene又具有父节点内容root (您的变量)。 此root由FXMLLoader设置,表示“PortalUI.fxml”文件中定义的布局/节点结构。
换句话说, Stage -> Scene -> PortalUI.fxml(root)将定义视图部分。

Controller是实现Initializable的类,并且您在PortalUI.fxml文件中使用fx:controller =“”属性指定。 你在那里指定的类(我猜想是PortalController)将被FXMLLoader创建并调用其initialize()方法。 即,在加载PortalUI.fxml文件时将创建Controller,因此您无需自己创建和初始化它。 要从FXMLLoader 获取控制器的创建/初始化实例,请查看Accessing FXML控制器类 。

Model是控制器存储和管理的底层数据结构。 它可以是代表“数据”的任何东西。 例如,Person,PortalInfo等类。