在JavaFX中后台执行任务 [英] Execute task in background in JavaFX

查看:250
本文介绍了在JavaFX中后台执行任务的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在TilePane中最多加载九个面板.对于每个窗格,我必须首先计算内容(大约300毫秒),然后再构建面板(大约500毫秒).

I want to load up to nine panels in a TilePane. For each pane I have to first run a computation of the content (about 300ms) and then I have to build the Panel (about 500ms).

我想要的是,有九个ProgressIndicators在计算每个面板后与之交换.

What I want is, that there are nine ProgressIndicators which exchanges with every panel after its computation.

我使用Platform.runLater命令以及服务类进行了尝试.结果总是一样的.显示了ProgressIndicator,但没有显示动画.几秒钟后,所有面板都同时显示.

I tried it with the Platform.runLater command as well as with a service class. The result was always the same. The ProgressIndicator are shown, but not animated. After seconds there are all panels at once.

是否有可能指标一直都处于动画状态,并且我可以一个接一个地交换它们?

Is there a possibility, that the Indicators are animated the whole time and that I can exchange them one after another?

推荐答案

JavaFX具有事件分派线程,该事件分派线程用于UI事件. UI的所有工作都应在此线程上进行.而且非UI计算不应该在那里发生,以避免UI出现滞后.

JavaFX has Event Dispatch Thread which it uses for UI events. All work with UI should happen on this thread. And non-UI calculations shouldn't happen there to avoid lags in UI.

查看下一个代码:

public class Indicators extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        Pane root = new HBox();
        stage.setScene(new Scene(root, 300, 100));

        for (int i = 0; i < 10; i++) {
            final ProgressIndicator pi = new ProgressIndicator(0);
            root.getChildren().add(pi);

            // separate non-FX thread
            new Thread() {

                // runnable for that thread
                public void run() {
                    for (int i = 0; i < 20; i++) {
                        try {
                            // imitating work
                            Thread.sleep(new Random().nextInt(1000));
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                        }
                        final double progress = i*0.05;
                        // update ProgressIndicator on FX thread
                        Platform.runLater(new Runnable() {

                            public void run() {
                                pi.setProgress(progress);
                            }
                        });
                    }
                }
            }.start();
        }

        stage.show();

    }
}

这篇关于在JavaFX中后台执行任务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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