MVP、JavaFx和组件参考

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中的

我研究了所有流行的GUI模式——MVP、MVC、MVVM,最后我决定实现MVP(监控控制器)。所以我有以下对象(!)<代码>阶段JavaFX被设计为使用MVC模式。因此,使用MVC比使用MVP容易得多。在MVP中,演示者负责格式化要显示的数据。在JavaFX中,它是通过查看自动完成的。下面是JavaFX MVC的简要概述:

模型-您在应用程序中使用的领域数据/数据结构(例如个人、雇主、课程等)

查看-应用程序及其模型的UI定义。创建视图的首选方法是通过
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);