【问题标题】: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 文件的虚拟对象,设置 Scene 和 Stage 并让 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
    相关资源
    最近更新 更多