2016-03-08 7 views
0

Существует несколько учебников и примеров по этой теме, но все они являются своего рода родовой сборкой только в одном классе, чтобы показать, как она работает в целом.Модель JavaFX View ViewModel, где я должен выполнять задачи?

Итак, мой вопрос в том, когда я хотел бы следовать шаблону 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 
    } 
} 

ViewModel:

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")); 

    } 
} 

Надежда Я мог бы объяснить проблему.

Заранее благодарен!

+0

Просто чтобы убедиться: это изображение не является частью модели, а данные, основанные на данных модели? – fabian

ответ

0

В целом, ваши задачи должны быть реализованы в ViewModel. Фактическая реализация бизнес-логики должна выполняться в модели, например, в классе обслуживания. Затем ViewModel может использовать эту службу и обрабатывать все конкретные действия, такие как создание задачи для выполнения async и обновление значения прогресса. Однако ViewModel не может напрямую обновлять ProgressIndicator, но вместо этого viewModel может иметь «прогресс» DoubleProperty, который обновляется в ViewModel. В ViewController/CodeBehind вы привязываете фактический ProgressIndicator к этому свойству прогресса ViewModel. Таким образом, ViewModel не зависит от фактических элементов управления пользовательского интерфейса, а представление не содержит бизнес-логики.

Ваш пример немного особенный, я думаю. Обычно я бы сказал, что «BufferedImage» - это особый класс ui, который принадлежит только View, а не ViewModel или Model. Однако ваш пример выглядит так: BufferedImage является результатом бизнес-действий. В этом случае я бы создал ObjectProperty<BufferedImage> в вашей модели ViewModel и поставил задачу загрузить изображение в ViewModel. В вашем ViewController я бы добавил слушателя к этому свойству и поместил изображение в ui, когда оно изменится. Таким образом, ваш класс View не зависит от того, как загружается изображение.