2

だから、私は webview を持っていて、2 (または任意の数 > 1) ページを次々にロードしたいと考えています。ただし、ページの変更は、前のページが読み込まれた直後ではなく、一定時間後に発生する必要があります。例えば:

public void load() 
{
    engine.load("link1");
    //need to wait some time here
    engine.load("link2");
    //need to wait some time here
    engine.load("link3");
}

ページの読み込みが完了したときにスレッドをスリープさせようとしました:

engine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
        @Override
        public void changed(ObservableValue observableValue, Worker.State o, Worker.State o2) {
            if (o2.equals(Worker.State.SUCCEEDED)) {
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });

しかし、 engine.load() はページが読み込まれるまで待機しないため、機能しません (そのためのイベントリスナーがあるため)。これのもう 1 つのマイナス面は、Thread.sleep() が GUI とスレッド全体をブロックするため、読み込みリンクの間に配置できないことです。

解決策はありますか?ページが読み込まれた後、次のページの読み込みを開始する前に遅延を設定します。

よろしく、

イヴァン

4

2 に答える 2

2
Thread.sleep(n);

ウィンドウを描画するのはスレッドであるため、GUI をブロックします。

問題の解決策は、すべてのページを別のスレッドにロードすることです。しかし、javaFX スレッドにいない場合、ページをロードすることはできません...解決策は、Platform.runLater() 関数を使用してこれをロードすることです。

したがって、GUI をブロックせずにスリープできる別のスレッドに次のコードを実装する必要があります。

Platform.runLater(new Runnable() {

    @Override
    public void run() {
        webView.getEngine().load("http://www.my.url/");
    }
});
于 2013-07-17T15:44:33.550 に答える
1

エンジンが彼の答えで指摘しているようにThread.sleep、UI 更新スレッドをブロックしますが、これはあなたが望むものではありません。基本的に、UI スレッドでスリープすることはありません。

Thread.sleep 呼び出しをPauseTransitionに置き換えることをお勧めします。

これには、JavaFX アニメーション サブシステムがスレッド化を処理するという利点があり、適切なタイミングでコードが常に UI スレッドで呼び出されるようになるため、スレッド化について心配する必要はありません。. . 私の意見では、スレッド化について心配する必要がないことは常に良いことです。. .

engine.getLoadWorker().stateProperty().addListener(
  new ChangeListener<Worker.State>() {
    @Override
    public void changed(
        ObservableValue observableValue, 
        Worker.State oldState, 
        Worker.State state) {
      if (state.equals(Worker.State.SUCCEEDED)) {
        PauseTransition pause = new PauseTransition(Duration.seconds(3));
        pause.setOnFinished(new EventHandler<ActionEvent>() {
          @Override
          public void handle(ActionEvent event) {
            webView.getEngine().load("http://www.mynext.url/");
          }       
        });
        pause.play();
      }
    }
  }
);

特定の URL への接続エラーが初めて発生したときにスライドショー効果の動作が停止しないように、Worker 状態が FAILED の場合などから回復するための追加のロジックが必要になる場合があります。

UI スレッドにいるかどうかわからない場合は、スリープを考えている場所にデバッグ ステートメントを追加します。

System.out.println(Thread.currentThread().getName());

名前が「FX アプリケーション スレッド」の場合は、アニメーション フレームワークやタスクなどの別のメカニズムを使用して一時停止を処理する必要があります。

于 2013-07-17T19:55:41.467 に答える