Выполнение задачи после полной загрузки WebView

Возможно ли, чтобы задача автоматически запускалась после завершения загрузки WebEngine? Я знаю, что я могу получить Worker от WebEngine, чтобы указать ход загрузки, но, похоже, многократно опробовал Worker не изящное решение (т.е. Блокирование программы до загрузки страницы). Я знаю, что могу сделать это с помощью Task, так что могу ли я как-то получить Task для WebEngine и добавить выполнение в полную команду?

Ответ 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");
    }
  } );