【问题标题】:MVC with JavaFX and FXML带有 JavaFX 和 FXML 的 MVC
【发布时间】:2016-11-11 22:57:21
【问题描述】:

如果我有一个使用 FXML 的 JavaFX 项目,我将如何构建它以遵守模型-视图-控制器模式?这就是我假设的一般结构:

模型 - 基础程序(GUI 所代表的内容)。
查看 - FXML 文件。
控制器 - FXML 控制器。

这种表示的问题是无法通知视图模型的更改,因为它只是一个 FXML 文件。视图应该是 FXML 控制器类,然后我应该有一个主控制器类,以便 FXML 控制器从模型中获取信息,并且主控制器处理动作事件吗?在这种情况下,主控制器将如何访问 JavaFX 节点?

另外,在 MVC 模式中,main 方法应该在哪里?现在,它在我的 JavaFX Application 类中,然后它对程序的其余部分没有任何作用。此外,JavaFX 应用程序类应该是 MVC 模式的一部分,还是只需要初始化 GUI?

问题摘要(请阅读全文):

  1. 如何构建使用 FXML 以遵守 MVC 模式的 JavaFX 项目?视图应该是 FXML 控制器类,然后我应该有一个主控制器类,以便 FXML 控制器从模型中获取信息,而主控制器处理动作事件?
  2. 在 MVC 模式中,main 方法应该在哪里?
  3. JavaFX 应用程序类应该是 MVC 模式的一部分,还是只需要初始化 GUI?

【问题讨论】:

标签: java design-patterns model-view-controller javafx fxml


【解决方案1】:

如何构建使用 FXML 的 JavaFX 项目以遵守 MVC 模式?视图应该是 FXML 控制器类,然后 我应该有一个主控制器类,这样 FXML 控制器 从模型中获取信息,主控制器处理 动作事件?

JavaFX 和 Swing 都在推动视图和控制器之间的紧密耦合,理由是制作通用控制器很困难。但是,MVC 本身有一些解释,所以有点模糊。

鉴于视图和控制器紧密耦合的理由,您有一些选择。我会建议两个,也许其他人可以添加甚至不同意。

1) 接受 View 类只是加载 FXML 文件的虚拟对象,设置 SceneStage 并让 FXMLController 类观察模型并更新视图。

这将 Controller 限制为 JavaFXML 应用程序,这意味着它不能轻易地与 Swing 互换。尽管只要引用正确的 Controller 并且所有 onAction 或等效的 Node 属性都使用相同的引用,更改 View 既快速又简单。

2) 不要使用提供的骨架代码。而是让视图加载 FXML 文件并手动访问节点,另外从 FXML 文件中删除 fx:controller 属性,并从 FXML 文件中的相关节点中删除 onAction 属性。

然后您可以根据需要从视图中的 FXML 访问任何Node,例如

Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));
Button example = (Button) root.lookup("#button"); // #button exists in FXMLDocument.fxml
example.setOnAction(e -> { myController.doSomething(); });

这为您提供了优势或指定您自己的通用控制器,并允许 View 类观察模型本身。

归根结底,最重要的是将模型与视图和控制器分开,因为模型是程序的核心。 Smart Model, Thin Controller, Dumb View

main方法应该在哪里?

没关系。但是,如果创建的 JAR 是由 JavaFX Packager Tool 完成的,那么 JavaFX 应用程序并不严格需要 main 方法,而是使用 launch 作为入口点。但是,您可以使用 main 方法作为单独类中的入口点,并改为调用 Application.launch(MyJavaFXApplicationClass.class);

JavaFX 应用程序类应该是 MVC 模式的一部分,或者是 只需要初始化GUI?

是的,因为它是视图的一部分。请参阅我上面提到的两种方法。

【讨论】:

  • 那么Application类会有对模型的引用,观察变化,必要时修改视图?
  • 我同意Both JavaFX and Swing push towards tight coupling between the View and the Controller 的观点,控制器几乎感觉就像是 FXML 文件的“支持”类。
【解决方案2】:

在我看来,如果每个从 JavaFX 开始的人都首先尝试发明自己的方案来实现 MVC 的一种变体,这并不是很有帮助。相反,应该选择许多已经存在的应用程序框架(用于 JavaFX)之一,尝试理解它,然后严格遵循该框架的指导来构建应用程序。 我个人最喜欢的是mvvmFX,当然你也可以使用其他的,比如 AfterburnerFX。研究和使用这样的框架将回答这里关于 SO 的许多经常被问到的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    相关资源
    最近更新 更多