JavaFX SwingWorker等效?

JavaFX是否与Java SwingWorker类等效?

我知道JavaFX 任务,但你只能发布字符串消息或进度。 我只想在GUI线程中调用一个方法,就像我对SwingWorker一样(通过发布任意类型的消息)。

赫雷斯是我的意思的一个例子:

class PrimeNumbersTask extends SwingWorker<List, Integer> { PrimeNumbersTask(JTextArea textArea, int numbersToFind) { //initialize } @Override public List doInBackground() { while (! enough && ! isCancelled()) { number = nextPrimeNumber(); publish(number); setProgress(100 * numbers.size() / numbersToFind); } } return numbers; } @Override protected void process(List chunks) { for (int number : chunks) { textArea.append(number + "\n"); // HERE: execute in GUI thread } } } 

非常感谢您的回答。 我正在寻找的解决方案是使用Platform.runLater(Runnable guiUpdater) 。

我会按如下方式重写你的SwingWorker

 class PrimeNumbersTask extends Task> { PrimeNumbersTask(TextArea textArea, int numbersToFind) { // initialize } @Override protected List call() throws Exception { while (!enough && !isCancelled()) { number = nextPrimeNumber(); updateMessage(Integer.toString(number)); updateProgress(numbers.size(), numbersToFind); } return numbers; } } 

用法:

 TextArea textArea = new TextArea(); PrimeNumbersTask task = new PrimeNumbersTask(numbersToFind); task.messageProperty().addListener((w, o, n)->textArea.appendText(n + "\n")); new Thread(task).start(); // which would actually start task on a new thread 

说明:

是的,我们没有像SwingWorker在JavaFX中那样的publish()方法,但在你的情况下使用updateMessage()就足够了,因为我们可以为这个属性注册一个监听器,并在每次更新消息时附加一个新行。

如果这还不够,您可以始终使用Platform.runLater()来安排GUI更新。 如果你做了太多的GUI更新并且GUI线程正在减慢,你可以使用以下习语: 限制javafx gui更新

除了只能传递字符串的updateValue方法之外,还有updateValue方法,您可以在其中传递整个对象,因此我相信您可以以类似的方式使用它。 任务文档的“返回部分结果的任务 部分中描述了此方法。 另一种方法是在其他答案中提到的Platform.runLater()方法。

请注意,这些方法之间的一个重要区别是,第一个方法是合并结果,这意味着对于多个频繁的updateValue调用,可能会省略一些以保护FX线程泛滥。

另一方面,Platform.runLater方法将发送所有中间结果,但由于如果您有高频率更新,FX线程泛滥的危险,可能需要一些额外的努力来手动避免它,如@eckig在他的建议答案指向Throttling javafx gui更新

不要使用SwingWorker。 SwingWorker.java源代码中的这段代码应该足以使用它:

 private static final int MAX_WORKER_THREADS = 10; 

而是熟悉Executor及其附带的服务。

它与JavaFX无关,它只是普通的Java。 但是,您的问题与JavaFX有关。 这是一个关于如何使用Platform.runLater()在JavaFX应用程序线程中更新UI的示例。