使用场景生成器的 JavaFX 中的 MVC 模式

我是JavaFX的新手,鉴于我目前的设置,我正在努力创建一个合适的MVC架构。我使用场景生成器单击了一个 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();
    }
}

控制器类包含代码的其余部分。

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

我的教授要求我进一步分离这个应用程序的关注点和责任。控制器不仅管理状态并与后端通信,而且还更新视图。

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

但是,我不知道如何连接这些部分。例如,我永远不需要实例化视图,因此没有可以传递给控制器的视图实例。接下来,我尝试将它们全部设置为单例,并简单地让 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 模式?是否需要不同的体系结构?


答案 1

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

-- Controller 是实现的类,并且您在 PortalUI.fxml 文件中使用 fx:controller=“ 属性指定了该类。您在此处指定的类(我想是 PortalController)将由 FXMLLoader 创建并调用其方法。也就是说,控制器将在加载PortalUI.fxml文件时创建,因此您无需自己创建和初始化它。若要从 FXMLLoader 获取控制器的已创建/初始化实例,请查看 Access FXML 控制器类Initializableinitialize()

-- 模型是由控制器存储和管理的基础数据结构。它可以是表示“数据”的任何内容。例如,Person、PortalInfo 等类。


答案 2

推荐