Executors.newSingleThreadExecutor结合javafx的Task更新进度条(二)

孤街浪徒 提交于 2020-09-29 21:41:26

上一帖中进度要用javafx的Task实现,不能多次点击操作,而javafx的Service却不同(参见帖子),service可以reset和restart一个Task,service可以通过new Thread,ThreadPoolExecutor或Executor来执行。所以代码修改如下:

mBar.progressProperty().unbind();
        mBar.progressProperty().bind(progressBarService.progressProperty());
        if((progressBarService.getState() == Worker.State.CANCELLED) || (progressBarService.getState() == Worker.State.SUCCEEDED)|| (progressBarService.getState() == Worker.State.FAILED))
            progressBarService.restart();
        else
            progressBarService.start();

 

ProgressBarService progressBarService = new ProgressBarService();
class ProgressBarService extends Service<Integer>{

    @Override
    protected void ready() {
        super.ready();
        System.out.println("ProgressBarService ready!");
    }

    @Override
    protected void scheduled() {
        super.scheduled();
        System.out.println("ProgressBarService scheduled!");
    }

    @Override
    protected void running() {
        super.running();
        System.out.println("ProgressBarService running!");
    }

    @Override
    protected void succeeded() {
        super.succeeded();
        System.out.println("ProgressBarService succeeded!");
    }

    @Override
    protected void cancelled() {
        super.cancelled();
        System.out.println("ProgressBarService cancelled!");
    }

    @Override
    protected void failed() {
        super.failed();
        System.out.println("ProgressBarService failed!");
    }

    @Override
    public boolean cancel() {

        System.out.println("ProgressBarService cancel!");
        return super.cancel();
    }

    @Override
    public void restart() {
        super.restart();
        System.out.println("ProgressBarService restart!");
    }

    @Override
    public void reset() {
        super.reset();
        System.out.println("ProgressBarService reset!");
    }

    @Override
    public void start() {
        super.start();
        System.out.println("ProgressBarService start!");
    }

    @Override
    protected void executeTask(Task<Integer> task) {
        super.executeTask(task);
        System.out.println("ProgressBarService executeTask!");
    }

    @Override
    protected Task<Integer> createTask() {
        System.out.println("ProgressBarService createTask!");

        return new Task<Integer>(){
            @Override
            protected void scheduled() {
                super.scheduled();
                System.out.println("createTask scheduled.....");
            }

            @Override
            protected void running() {
                super.running();
                System.out.println("createTask running.....");
            }

            @Override
            protected void succeeded() {
                super.succeeded();
                System.out.println("createTask succeeded.....");
            }

            @Override
            protected void cancelled() {
                super.cancelled();
                System.out.println("createTask cancelled.....");
            }

            @Override
            protected void failed() {
                super.failed();
                System.out.println("createTask failed.....");
            }

            @Override
            protected void updateProgress(long workDone, long max) {
                super.updateProgress(workDone, max);
                System.out.println("createTask long updateProgress.....");
            }

            @Override
            protected void updateProgress(double workDone, double max) {
                super.updateProgress(workDone, max);
                System.out.println("createTask double updateProgress.....");
            }

            @Override
            protected void updateMessage(String message) {
                super.updateMessage(message);
                System.out.println("createTask updateMessage.....");
            }

            @Override
            protected void updateTitle(String title) {
                super.updateTitle(title);
                System.out.println("createTask updateTitle.....");
            }

            @Override
            protected void updateValue(Integer value) {
                super.updateValue(value);
                System.out.println("createTask updatevalue.....");
            }

            @Override
            protected Integer call() throws Exception {
                for(int i=0;i<100;i++)
                {
                    if(isCancelled())
                    {
                        System.out.println("call iscancelled!");
                        return -1;
                    }
                    Thread.sleep(200);
                    updateProgress(i,100);
                }
                updateProgress(100,100);
                return 100;
            }
        };

    }
}

则可以反复点击cancel按钮再点击启动按钮。当不cancel,进度条100%全部正常结束时,出现一个勾,并且显示“完成”。当100%完成之后,点击cancel按钮,其实service.getState()不是cancelled状态而是successed状态.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!