JavaFX SwingWorker 等效吗? [英] JavaFX SwingWorker Equivalent?
问题描述
是否有等效于 Java SwingWorker 类的 JavaFX?
Is there a JavaFX equivalent to the Java SwingWorker class?
我知道 JavaFX Task 但有了它你只能发布字符串消息或进度.我只想在 GUI 线程中调用一个方法,就像我对 SwingWorker 所做的那样(通过发布任意类型的消息).
I am aware of the JavaFX Task but with that you can only publish String messages or a progress. I just want to call a method in the GUI thread like I would have done with the SwingWorker (by publishing messages of an arbitrary type).
这是我的意思的一个例子:
Heres is an example of what I mean:
class PrimeNumbersTask extends
SwingWorker<List<Integer>, Integer> {
PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
//initialize
}
@Override
public List<Integer> doInBackground() {
while (! enough && ! isCancelled()) {
number = nextPrimeNumber();
publish(number);
setProgress(100 * numbers.size() / numbersToFind);
}
}
return numbers;
}
@Override
protected void process(List<Integer> chunks) {
for (int number : chunks) {
textArea.append(number + "
"); // HERE: execute in GUI thread
}
}
}
解决方案
非常感谢您的回答.我正在寻找的解决方案是使用 Platform.runLater(Runnable guiUpdater).
Thank you very much for your answers. The solution I was searching for, is to use Platform.runLater(Runnable guiUpdater).
推荐答案
我会将你的 SwingWorker
改写如下:
I would rewrite your SwingWorker
as follows:
class PrimeNumbersTask extends Task<List<Integer>> {
PrimeNumbersTask(TextArea textArea, int numbersToFind) {
// initialize
}
@Override
protected List<Integer> 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 + "
"));
new Thread(task).start(); // which would actually start task on a new thread
说明:
是的,我们没有 JavaFX 中的 SwingWorker
那样的 publish()
方法,但在您的情况下使用 updateMessage()
> 就足够了,因为我们可以为这个属性注册一个监听器,并在每次消息更新时追加一个新行.
Yes, we do not have a publish()
method as the SwingWorker
does in JavaFX, but in your case using the updateMessage()
is sufficient, as we can register a listener to this property and append a new line every time the message is updated.
如果这还不够,您可以随时使用 Platform.runLater()
以安排 GUI 更新.如果您进行了太多 GUI 更新并且 GUI 线程变慢,您可以使用以下习惯用法:限制 javafx gui 更新
If this is not enough, you can always use Platform.runLater()
to schedule GUI updates. If you are doing too many GUI updates and the GUI Thread is being slowed down, you can use the following idiom: Throttling javafx gui updates
这篇关于JavaFX SwingWorker 等效吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!