15

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?

4

1 に答える 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
  }
} );

ラムダ式として:

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 に答える