MVP、JavaFx和组件参考
我研究了所有流行的GUI模式——MVP、MVC、MVVM,最后我决定实现MVP(监控控制器)。所以我有以下对象(!)<代码>阶段JavaFX被设计为使用MVC模式。因此,使用MVC比使用MVP容易得多。在MVP中,演示者负责格式化要显示的数据。在JavaFX中,它是通过查看自动完成的。下面是JavaFX MVC的简要概述: 模型-您在应用程序中使用的领域数据/数据结构(例如个人、雇主、课程等) 查看-应用程序及其模型的UI定义。创建视图的首选方法是通过MVP、JavaFx和组件参考,java,design-patterns,model-view-controller,javafx,Java,Design Patterns,Model View Controller,Javafx,我研究了所有流行的GUI模式——MVP、MVC、MVVM,最后我决定实现MVP(监控控制器)。所以我有以下对象(!)阶段JavaFX被设计为使用MVC模式。因此,使用MVC比使用MVP容易得多。在MVP中,演示者负责格式化要显示的数据。在JavaFX中,它是通过查看自动完成的。下面是JavaFX MVC的简要概述: 模型-您在应用程序中使用的领域数据/数据结构(例如个人、雇主、课程等) 查看-应用程序及其模型的UI定义。创建视图的首选方法是通过FXML文件,该文件本质上就是javafxmvc中的
FXML
文件,该文件本质上就是javafxmvc中的视图
控制器-连接模型和视图的桥梁。代码通常在XController
类中隔离(其中X是FXML
视图的名称)。Controller的实例由fxmloader
自动注入,或者在需要自定义控制器的情况下可以手动注入。控制器
类将有权访问UI(视图)元素,以便能够操作不同的属性和模型,从而可以基于UI(视图)输入执行操作
总之,在JavaFX中不需要类视图
,视图的定义应该完全在FXML
文件中。所有UI元素都应注入@FXML
到控制器
类中。如果您必须使用MVP,那么AWT/Swing或MVP4j-可能是更好的选择
有关更详细的说明,请参阅官方的Oracle JavaFX教程:
如果需要使用FXML构建UI的帮助:
本教程介绍了JavaFX中MVC的基础知识以及每个组件如何与其他组件通信:作为一名Android开发人员,我总是在我的应用程序中使用MVP模式。MVC和MVP相比对我来说似乎太老了,所以当我开始开发一个新的Java应用程序时,我感到有点失落
以下是我的解决方案:
初始步骤
- 在
fxml
文件中创建UI,不指定控制器,因为您不需要控制器。
- 创建Java接口(IView、IPresenter等)
- 在Presenter
类
中实现IPresenter接口
,这与您通常所做的一样(执行http请求、查询数据库..)
现在有趣的部分是:
使您的视图适应MVP模式
让我们看一些代码:
- 创建您的GUI(例如主GUI)并实现视图
界面
public class MainGUI extends Application implements MainContract.View {
public static void main(String... args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws IOException {
//here we will load fxml or create the ui programmatically
}
//method from view interface
@Override
public void onServerResponse(String message) throws IOException {
//update the view
}
现在是最后一步:
与演示者沟通
- 为此,我们首先创建演示者的距离:
private MainContract.Presenter presenter;
public MainGUI() {
presenter = new MainPresenter(this);
}
这个
当然是主合同。视图
在MainGUI类
- 现在我们必须获得视图组件的引用
private ComboBox<Double> mySimpleList;
@Override
public void start(Stage primaryStage) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("layout_main.fxml"));
Parent root = loader.load();
mySimpleList= (ComboBox<Double>) loader.getNamespace().get("mysimplelist_id");
...
primaryStage.setScene(new Scene(root, -1, -1));
primaryStage.show();
- 听众呢
...
mySimpleList.valueProperty().addListener(simpleListListener);
什么是SimpleListener
?
一个简单的ChangeListener
,我们最后调用一个presenter方法
simpleListListener = (ChangeListener<Double>)
(observable, oldValue, newValue) -> presenter.doTheLogic(newValue);
SimpleListener=(ChangeListener)
(可观察、旧值、新值)->presenter.doTheLogic(新值);
这是一个简单的场景,但原则上这就是我们如何在JavaFX中使用MVP模式。我也明白,这不是最终的解决方案,所以我希望有一天会有更多的文档,我可以了解更多关于这个论点!
如果我对代码的某些部分不清楚,请告诉我如何加载MyView?您是用代码构建还是从FXML加载?@Steven Van Impe我是用代码构建的,我真的很困惑,在JavaFX项目中使用MVC还是MVP,这里的问题是控制器如何在MVC模型中进行通信?但是IDE为视图创建了一个控制器,为什么我们需要转向MVP模式?
...
mySimpleList.valueProperty().addListener(simpleListListener);
simpleListListener = (ChangeListener<Double>)
(observable, oldValue, newValue) -> presenter.doTheLogic(newValue);