14

我是 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 创建另外两个类。

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

4

1 回答 1

24

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

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

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

于 2012-06-03T21:20:51.573 回答