我是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.
}
我该怎么办? ^^
答案 0 :(得分:1)
我建议您与控制器进行通信,控制器将更新View。在这种情况下,它将是Supervising Controller,而不是经典的。{/ p>
监督控制员有两个主要职责:输入 响应和部分视图/模型同步。 (Martin Fowler在Supervising Controller)
为此,我将在模型上创建一个带有控制器实现的回调接口。当调用下载或构建模型时,或者在寄存器方法中,我会将回调对象从控制器传递给模型,然后模型将调用它上面的更新方法,这些方法将在控制器中处理以更新GUI。
在您的情况下,一个重要的事情是线程。当您使用JavaFX时,如果您在主线程中执行所有这些操作,您的GUI将“冻结”。所以你必须创建另一个线程来装载你的文件。
此外,在另一个线程中,您将无法更新GUI。要正确执行,您应该使用Platform.runLater(java.lang.Runnable runnable)
,因此传递的Runnable将由JavaFX在主线程上执行。