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