JavaFX SwingWorker 等效吗? [英] JavaFX SwingWorker Equivalent?

查看:26
本文介绍了JavaFX SwingWorker 等效吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有等效于 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆