Is it possible to have a task automatically run after the WebEngine
finishes loading? I know I can get a Worker
from WebEngine
to indicate loading progress, but it seems like repeatedly polling the Worker
not an elegant solution (i.e. locking up program until page loads). I know I can do this with a Task
, so can I get the Task
for WebEngine
somehow, and add an execute on complete command?
Sample based on the 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
}
} );
As a lambda expression:
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
} );
If you only want to listen to the next page load and not every subsequent page load, then stop listening after the page loaded.
To do that, then you can remove the listener (in the listener code) once it has started to execute:
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");
}
} );
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With