2014-03-02 53 views
0

我是JavaFx的新手。我做了我的fxml文件,并创建了我的控制器。目前一切正常。 在我的模型中,我有从互联网上下载一些文件的线程。我想通知进展到UI(更新进度指示器组件)。JavaFx我的模型如何更新View?

我该怎么办?

这是Controller调用的模型方法。 我想通知用户进程的进展。 例如:线程每完成一次+ 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. 
} 

我该怎么办? ^^

+0

在javafx中,您应该使用[Service](http://docs.oracle.com/javafx/2/api/javafx/concurrent/Service.html)和任务来更新进度。这是一个[很好的示例](https://gist.github.com/jewelsea/4947946),它显示了一个单独的线程和一个更大的线程池。你有很多任务,所以你可能想看看更大的线程池。 – brian

+1

DataFX中的ProcessChain类完全符合您的需求:http://www.guigarage.com/2014/01/datafx-8-preview-2-processchain/ –

回答

1

我建议你与控制器进行通信,它将更新视图。在这种情况下,它将是Supervising Controller,而不是经典的。

监督控制器有两个主要职责:输入 响应和部分视图/模型同步。 (马丁·福勒Supervising Controller

对于这一点,我将创建模型上的回调接口与控制器上的实现。在调用下载或构建模型或注册方法时,我会将回调对象从控制器传递给模型,然后模型会调用更新方法,以便在控制器中处理更新GUI。

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

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