我是 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。
我的第一 react 是让 Controller 类成为 View,并为 Controller 和 Model 创建另外两个类。
但是,我不知道如何连接这些片段。我从不需要实例化 View,因此没有 View 实例可以传递给我的 Controller,例如。接下来,我尝试将它们全部设为单例,并让 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
(您已创建并设置),它又具有一个父节点内容 root
(您的变量)。此 root
节点由 FXMLLoader 设置,代表“PortalUI.fxml”文件中定义的布局/节点结构。
换句话说,Stage -> Scene -> PortalUI.fxml(root)
将定义 View 部分。
-- Controller 是实现 Initializable
的类,您在 PortalUI.fxml 文件中指定了 fx:controller=""属性。您在此处指定的类(我想是 PortalController)将由 FXMLLoader 创建并调用其 initialize()
方法。即Controller会在PortalUI.fxml文件加载时创建,不需要自己创建和初始化。要从 FXMLLoader 获取创建/初始化的 Controller 实例,请查看 Accessing FXML controller class .
-- Model 是 Controller 存储和管理的底层数据结构。它可以是代表“数据”的任何东西。例如Person、PortalInfo等类。
关于java - 带有 Scene Builder 的 JavaFX 中的 MVC 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10872444/