JavaFx我的模型如何更新View?

时间:2014-03-02 15:45:46

标签: java model-view-controller javafx

我是JavaFx的新手。我制作了我的fxml文件并创建了我的Controller。一切都运作良好。 在我的模型中,我有从线程下载一些文件的线程。我想通知UI的进度(更新进度指示器组件)。

我该怎么办?

这是Controller调用的Model方法。 我想告诉用户该过程的进展。 例如:每次线程完成时+ 10%。

 public void download(){
    ExecutorService pool = Executors.newSingleThreadExecutor();
    List<Future<String>> futures = new ArrayList<Future<String>>();
    futures.add(pool.submit(new Downloader(URL)));
    futures.add(pool.submit(new Downloader(URL)));
    pool.shutdown();
    pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
    ... Manipulate downloaded files.
 }

我该怎么办? ^^

1 个答案:

答案 0 :(得分:1)

我建议您与控制器进行通信,控制器将更新View。在这种情况下,它将是Supervising Controller,而不是经典的。{/ p>

  

监督控制员有两个主要职责:输入   响应和部分视图/模型同步。   (Martin Fowler在Supervising Controller

为此,我将在模型上创建一个带有控制器实现的回调接口。当调用下载或构建模型时,或者在寄存器方法中,我会将回调对象从控制器传递给模型,然后模型将调用它上面的更新方法,这些方法将在控制器中处理以更新GUI。

在您的情况下,一个重要的事情是线程。当您使用JavaFX时,如果您在主线程中执行所有这些操作,您的GUI将“冻结”。所以你必须创建另一个线程来装载你的文件。

此外,在另一个线程中,您将无法更新GUI。要正确执行,您应该使用Platform.runLater(java.lang.Runnable runnable),因此传递的Runnable将由JavaFX在主线程上执行。