JavaFX中的MVC模式与Scene Builder

IAE*_*IAE 14 java architecture model-view-controller javafx

我是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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Controller类包含其余代码.

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

我的教授要求我进一步分离这个申请的关注点和责任.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ulu*_*Biy 23

您的,
- ViewStageJavaFX平台在启动时提供的主要功能.此阶段具有唯一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等类.