java - 如何在 JavaFX 中为网页加载过程制作进度条?
问题描述
我正在开发一个使用WebView
. 我想做一个ProgressBar
向用户显示加载页面的进度。我知道如何创建一个ProgressBar
,以及如何使用它,但我不知道如何获得WebView
/的进度WebEngine
。我如何获得进度以更新ProgressBar
?
解决方案
你可以像下面的代码那样做:
使用后台线程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)。
推荐阅读
- java - H2,Spring boot-JPA:使用 OffsetTime 字段检索实体的问题
- java - return 语句是否关闭 BufferedReader?
- google-sheets - 谷歌表格-如何计算过去 n 天的平均值,假设 n 数是可变的?
- angular - 如何使用默认路由将角度应用程序重定向到其他组件
- java - SimpleDateFormat: Unparseable date when I try parse month: MMM dd, yyyy
- typescript - Cleaner function overloading without replicating parts that do not change
- java - 我可以在其他步骤中调用黄瓜步骤方法吗?
- vhdl - 如何将 ps 中读取的时间转换和报告为 VHDL 中 Hz 或 MHz 或 KHz 的频率?
- sql - 如何仅获取当月的价值
- python - JDBC 数据块到数据块的连接