WebEngine
完成加载后是否可以自动运行任务?我知道我可以从Worker
获得WebEngine
来表示加载进度,但似乎反复轮询Worker
并不是一个优雅的解决方案(即锁定程序直到页面加载)。我知道我可以使用Task
执行此操作,因此可以以某种方式获取Task
WebEngine
,并在完整命令上添加执行权吗?
答案 0 :(得分:19)
基于WebView documentation的示例:
webView.getEngine().getLoadWorker().stateProperty().addListener(
new ChangeListener<Worker.State>() {
@Override
public void changed(
ObservableValue<? extends Worker.State> observable,
Worker.State oldValue, Worker.State newValue ) {
if( newValue != Worker.State.SUCCEEDED ) {
return;
}
// Your logic here
}
} );
作为lambda表达式:
webView.getEngine().getLoadWorker().stateProperty().addListener(
(ObservableValue<? extends Worker.State> observable,
Worker.State oldValue,
Worker.State newValue) -> {
if( newValue != Worker.State.SUCCEEDED ) {
return;
}
// Your logic here
} );
如果您只想收听下一页加载而不是每个后续页面加载,请在加载页面后停止收听。
为此,您可以在侦听器开始执行后删除侦听器(在侦听器代码中):
webview.getEngine().getLoadWorker().stateProperty().addListener(
new ChangeListener<Worker.State>() {
@Override
public void changed(
ObservableValue<? extends Worker.State> observable,
Worker.State oldValue, Worker.State newValue) {
switch (newValue) {
case SUCCEEDED:
case FAILED:
case CANCELLED:
webview
.getEngine()
.getLoadWorker()
.stateProperty()
.removeListener(this);
}
if (newValue != Worker.State.SUCCEEDED) {
return;
}
// Your logic here
System.out.println("page loaded");
}
} );