所以,我有一个 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");
}
我尝试在页面加载完成时让线程 hibernate :
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() 不会等到页面加载(因为我们有事件监听器)。另一个缺点是 Thread.sleep() 会阻塞 GUI 和整个线程,因此我无法将其放置在加载链接之间。
有什么解决办法吗?在页面加载之后和开始加载下一页之前设置延迟。
问候,
伊万
最佳答案
Thread.sleep(n);
这是绘制窗口的线程,这就是它会阻塞 GUI 的原因。
问题的解决方案是在单独的线程中加载所有页面。 但是如果您不在 javaFX 线程中,则无法加载页面...... 解决方案是使用 Platform.runLater() 函数加载它。
因此,您必须将以下代码实现到一个单独的线程中,该线程可以 hibernate 而不阻塞 GUI。
Platform.runLater(new Runnable() {
@Override
public void run() {
webView.getEngine().load("http://www.my.url/");
}
});
关于JavaFX webview 加载页面之间的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16521878/