WebEngine
是否可以在完成加载后自动运行任务?我知道我可以得到一个Worker
fromWebEngine
来指示加载进度,但似乎反复轮询Worker
不是一个优雅的解决方案(即锁定程序直到页面加载)。我知道我可以用 a 来做到这一点Task
,所以我能Task
以某种方式获得 forWebEngine
并在完整命令上添加一个执行吗?
问问题
9467 次
1 回答
23
基于WebView 文档的示例:
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");
}
} );
于 2012-09-22T03:34:55.793 回答