【问题标题】:JavaFX Model View ViewModel where should I implement tasks?JavaFX Model View ViewModel 我应该在哪里实现任务?
【发布时间】:2016-03-08 05:55:09
【问题描述】:

有几个关于这个主题的教程和示例,但它们都是一种通用构建,仅在一个类中展示它的一般工作原理。

所以我的问题是什么时候我想遵循 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"));

     }
}

希望我能解释这个问题。

提前致谢!

【问题讨论】:

  • 只是为了确保:该图像不是模型的一部分,而是基于模型数据的数据?

标签: mvvm javafx task viewmodel worker


【解决方案1】:

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

我认为你的例子有点特别。通常我会说“BufferedImage”是一个特定于 UI 的类,它只属于 View 而不是 ViewModel 也不属于 Model。但是,您的示例看起来像 BufferedImage 是业务操作的结果。在这种情况下,我将在您的 ViewModel 中创建一个 ObjectProperty&lt;BufferedImage&gt; 并将任务也加载到 ViewModel 中。在您的 ViewController 中,我会为此属性添加一个侦听器,并在图像更改时将其放入 ui 中。 这样,您的 View 类就与图像的加载方式无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多