在 Web 视图完全加载后执行任务

2022-09-03 13:11:48

是否可以在完成加载后自动运行任务?我知道我可以得到一个从来指示加载进度,但它似乎反复轮询不是一个优雅的解决方案(即锁定程序直到页面加载)。我知道我可以用 a 来做到这一点,所以我可以以某种方式获取 for,并添加一个执行 on complete 命令吗?WebEngineWorkerWebEngineWorkerTaskTaskWebEngine


答案 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
  }
} );

作为 lambda 表达式:

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");
    }
  } );

答案 2

推荐