Возможно ли, чтобы задача автоматически запускалась после завершения загрузки WebEngine
? Я знаю, что я могу получить Worker
от WebEngine
, чтобы указать ход загрузки, но, похоже, многократно опробовал Worker
не изящное решение (т.е. Блокирование программы до загрузки страницы). Я знаю, что могу сделать это с помощью Task
, так что могу ли я как-то получить Task
для WebEngine
и добавить выполнение в полную команду?
Выполнение задачи после полной загрузки WebView
Ответ 1
Пример на основе документации 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
}
} );
Как лямбда-выражение:
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");
}
} );