JavaFX 模型视图视图模型我应该在哪里实现任务


有几个

关于这个主题的教程和示例,但它们都是一种通用构建,只在一个类中展示它是如何工作的。

所以我的问题是我什么时候想遵循 MVVM 模式,我必须实现我的所有任务?

鉴于以下情况:

型:

class Model {
   /* When I place the Task here how can I deal with arguments and results from ViewController? */
   public BufferedImage bigTask (String this, String and, Image that){
       // Some code to build a BufferedImage
   }
}

视图模型:

class ViewController {
     private BufferedImage myBufferedImage;
     @FXML
     private Button aButton;

     /*Should I implement my Task here? But how I get information about progress? */
     final Task<Integer> myTask = new Task<Integer>(){
          @Override
          protected Integer call() throws Exception{
               updateProgress( // How to get here? Is it the right place? )
               return null;
          }
     };

     @FXML
     void setOnAction(ActionEvent actionEvent){
          myBufferedImage = Model.bigTask("this", "that", new Image("path"));
     }
}

希望我能解释这个问题。

提前感谢!

通常,

您的任务应该在 ViewModel 中实现。业务逻辑的实际实现应在模型中完成,例如在服务类中。然后,ViewModel 可以使用此服务并处理所有特定于 UI 的操作,例如创建用于异步执行的任务和更新进度值。但是,ViewModel 可能不会直接更新进度指示器,而是 ViewModel 可以具有在 ViewModel 中更新的 DoubleProperty "进度"。在 ViewController/CodeBehind 中,将实际的进度指示器绑定到 ViewModel 的此进度属性。这样,视图模型独立于实际的 UI 控件,并且视图不包含任何业务逻辑。

我认为你的例子有点特别。通常我会说"BufferedImage"是一个特定于UI的类,它只属于视图,而不属于视图模型或模型。但是,您的示例看起来像 BufferedImage 是业务操作的结果。在这种情况下,我会在您的视图模型中创建一个ObjectProperty<BufferedImage>,并将加载图像的任务也放在视图模型中。在您的视图控制器中,我会向此属性添加一个侦听器,并在图像更改时将图像放入 UI 中。这样,View 类就与图像的加载方式无关。

相关内容

  • 没有找到相关文章

最新更新