我研究了所有流行的GUI模式- MVP,MVC,MVVM,最后我决定实现MVP(监督控制器)。所以我有以下对象(!). Stage<-View<->Model
.舞台很重要!=视图,它是另一个对象。视图和模型数据绑定之间。此外,我有一个presenter(控制器),它处理所有事件,并与视图和模型一起工作,所以View<-ViewInterface<-Controller->Model
。现在的问题是如何在视图中获取对标签、文本区域等的引用。Javafx允许使用@FXML注解将这些组件注入控制器。然而,使用MVP时,我需要在View中使用这些组件,因为View的所有逻辑都在View中,而控制器中不需要它们。我知道的唯一解决办法是:
public class MyView{
private Button button;
public MyView(){
...
button=(Button) root.lookup("#myButton");
}
}
也就是通过ID获取引用。但是我不喜欢。或者我做错了什么,或者我理解错了什么,但我认为存在更好的解决方案。请帮我找到它。
3条答案
按热度按时间rkue9o1l1#
JavaFX被设计为使用MVC模式。因此,使用MVC比使用MVP容易得多。在MVP中,Presenter负责格式化要显示的数据。在JavaFX中,它是由View自动完成的。以下是JavaFX MVC的快速概述:
模型-您在应用程序中使用的域数据/数据结构(例如人员、雇主、课程作业等)
View-应用及其Model的UI定义。创建视图的首选方法是通过
FXML
文件,它本质上是JavaFX MVC中的View。Controller-连接Model和View的桥梁。代码通常隔离在
XController
类中(其中X是FXML
View的名称)。Controller的示例由FXMLLoader
自动注入,如果您需要自定义Controller,也可以手动注入。Controller
类可以访问UI(View)元素,以便能够操作不同的属性以及Model,从而可以根据UI(View)输入执行操作。总而言之,在JavaFX中,您不需要拥有类
View
,View定义应该完全在FXML
文件中。所有UI元素都应该使用@FXML
注入到Controller
类中。如果你一定要使用MVP,那么AWT/Swing或MVP 4j-http://www.findbestopensource.com/product/mvp4j可能是一个更好的选择。有关详细说明,请查看JavaFX的Oracle官方教程:http://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-overview.htm
如果您需要使用
FXML
构建UI的帮助:http://docs.oracle.com/javase/8/javafx/api/javafx/fxml/doc-files/introduction_to_fxml.html本教程涵盖了JavaFX中MVC的基础知识以及每个组件如何与其他组件进行通信:http://code.makery.ch/library/javafx-8-tutorial/part1/
bttbmeg02#
作为一个Android开发者,我总是在我的应用程序中使用MVP模式。与MVP相比,MVC对我来说似乎太老了,所以当我开始开发一个新的Java应用程序时,我感到有点失落。
我的解决方案如下:
初始步骤
fxml
文件中创建UI,不指定控制器,因为您不需要控制器。class
中实现IPresenterinterface
,就像您通常所做的那样(执行http请求、查询DB..)现在有趣的部分:
根据MVP模式调整视图
让我们看一些代码:
interface
最后一步:
与主讲人沟通
当然,
this
是在MainGUIclass
中实现的MainContract.View
我更喜欢使用
fxml
文件,而不是通过代码创建ui,但背后的逻辑是相同的。什么是
simpleListListener
?一个简单的
ChangeListener
,在这里我们最终调用了一个presenter方法这是一个简单的场景,但原则上这就是我们如何在JavaFX中使用MVP模式。我也明白这不是最终的解决方案,所以我希望有一天会有更多的文档,在那里我可以了解更多关于这个论点!
如果我在代码中的某些部分不清楚请告诉我
eagi6jfj3#
我知道这个问题很老了,但我还是决定把答案写在这里。
我首先要说的是,尽管被宣传为遵循MVC模式,但JavaFX/FXML实际上默认遵循MVP模式。
有几篇关于MVC与MVP(Baeldung - MVC vs MVP,GeeksForGeeks - MVC, MVP, MVVM)的好文章。在这里,我将指出关键的主要区别。
MVC模式
org.springframework.ui.Model
,请不要将其与MVC Model一起使用)到控制器中,并使用它将服务/应用程序层(MVC Model)返回的数据传递到视图中。我们还可以通过方法参数或ThreadLocals或其他方式将Model(org.springframework.ui.Model
)对象的示例直接传递到服务层,并实现“True MVC”。但是人们通常不会这样做,因为它耦合了应用程序逻辑(MVC模型)和视图(这是MVC的缺点,MVP试图解决)。MVP模式
总的来说,JavaFX/FXML非常灵活。它的事件处理和数据绑定功能很差,所以你可以完全使用事件驱动,最终使用MVVM(有人可能会说JavaFX/FXML默认遵循MVVM)。或者你可以更传统,最终使用MVP,你也可以开始将你的JavaFX数据绑定暴露到核心应用程序中,最终使用MVC和MVP的混合,但传统的JavaFX/FXML遵循MVP。仅仅因为JavaFX使用了“控制器”这个词并不意味着它遵循MVC。例如,Angular框架也是如此。Angular遵循MVVM,但它使用术语“控制器”来指代ViewModel。
最后一件事,在你的应用程序中并不强制要求它遵循MVP;)