首页 > 解决方案 > 如何在 JavaFX 中为网页加载过程制作进度条?

问题描述

我正在开发一个使用WebView. 我想做一个ProgressBar向用户显示加载页面的进度。我知道如何创建一个ProgressBar,以及如何使用它,但我不知道如何获得WebView/的进度WebEngine。我如何获得进度以更新ProgressBar

标签: javajavafxscenebuildernetbeans-8.2

解决方案


你可以像下面的代码那样做:

使用后台线程java.util.Timer或 Future 检索任务的方法仍然有效。但是JavaFX有一个内置的 API 来做这样的事情,它是Service和 Task 类(用于ScheduleService重复任务)。

// 在 JavaFX 线程上。

final Service<Foo> service = new Service<Foo> {  

    @Override  
    protected Task<Foo> createTask() {  
        return new Task<Foo>() {  

            @Override  
            protected Foo call() throws Exception {  
              // On another thread.  
              [...]  
              if (isCancelled()) {  
                  updateMessage("Cancelled");  
                  return null;  
              }  
              updateProgress(currentProgress++, totalProgress);  
              updateMessage("Now doing stuff");  
              [...]  
              return result;  
            }  
        };  
    }  
};  
progressBar.progressProperty().bind(service.progressProperty());  
service.setOnSucceeded(event -> {  
    // On the JavaFX thread.  
    progressBar.progressProperty().unbind();  
    final Foo foo = (Foo)event.getSource().getValue();  
    // Pass the result to the view.  
    [...]  
});  
service.setOnCancelled(event -> {  
    // On the JavaFX thread.  
    progressBar.progressProperty().unbind();  
    [...]  
});  
service.setOnFailed(event -> {  
    // On the JavaFX thread.  
    progressBar.progressProperty().unbind();  
    final Throwable ex = event.getSource().getException();  
    // Log and show.  
    [...]  
});  
service.start();

同一个 Service 可以重复使用多次(调用 cancel() 和 start() 或 restart()),而一个 Task 只能使用一次(Service 每次启动都会创建一个新的 Task)。


推荐阅读