JavaFX中的Platform.runLater和Task我已經(jīng)做了一些研究,但我仍然非常困惑,至少可以說。有人能給我一個什么時候使用的具體例子嗎?Task以及何時使用Platform.runLater(Runnable);?到底有什么區(qū)別?在什么時候使用這些東西有金科玉律嗎?另外,如果我錯了,請糾正我,但這兩個“對象”不是在GUI中的主線程內(nèi)創(chuàng)建另一個線程的方法(用于更新GUI)嗎?
3 回答

慕尼黑8549860
TA貢獻1818條經(jīng)驗 獲得超11個贊
Platform.runLater(...)
Task
Platform.runLater(...)
Platform.runLater(...)
:
final ProgressBar bar = new ProgressBar();new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 1000000; i++) { final int counter = i; Platform.runLater(new Runnable() { @Override public void run() { bar.setProgress(counter / 1000000.0); } }); }}).start();
這是一堆可怕的代碼,是對自然的一種犯罪(以及一般的編程)。首先,你會失去腦細胞,只看這雙巢的Runnable。第二,它將淹沒事件隊列中的小Runnable-實際上是其中的100萬。顯然,我們需要一些API來簡化后臺工作人員的編寫,然后與UI進行通信。
使用任務的代碼:
Task task = new Task<Void>() { @Override public Void call() { static final int max = 1000000; for (int i = 1; i <= max; i++) { updateProgress(i, max); } return null; }};ProgressBar bar = new ProgressBar();bar.progressProperty().bind(task.progressProperty());new Thread(task).start();
它沒有出現(xiàn)在前面的代碼中的任何缺陷。
參考資料:

牛魔王的故事
TA貢獻1830條經(jīng)驗 獲得超3個贊
Platform.runLater
:如果您需要從非GUI線程更新GUI組件,您可以使用它將您的更新放在隊列中,并且它將由GUI線程盡快處理。 Task
實現(xiàn) Worker
接口,當您需要在GUI線程之外運行一個長任務時(以避免凍結您的應用程序),它仍然需要在某個階段與GUI交互。
SwingUtilities.invokeLater
SwingWorker
.

郎朗坤
TA貢獻1921條經(jīng)驗 獲得超9個贊
@Overridepublic void actionPerformed(ActionEvent e) { Platform.runLater(() -> { try { //an event with a button maybe System.out.println("button is clicked"); } catch (IOException | COSVisitorException ex) { Exceptions.printStackTrace(ex); } });}
添加回答
舉報
0/150
提交
取消