【问题标题】:Execute a task after the WebView is fully loaded在 WebView 完全加载后执行任务
【发布时间】:2012-09-14 10:30:32
【问题描述】:

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

【问题讨论】:

    标签: java javafx webview javafx-2


    【解决方案1】:

    基于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
      }
    } );
    

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

    【讨论】:

    • 这是不完整的,因为每次页面完成加载时代码都会运行,要么您必须在代码运行后删除侦听器,要么找到另一个解决方案... method();然后是 webEngine.getLoadWorker().stateProperty().removeListener(this);
    • @firephil 我更新了答案以包含您评论中的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多