如何在JavaFx应用程序中等待WebEngine / Browser初始化?

时间:2015-11-28 12:05:10

标签: multithreading browser javafx wait

我想创建一个基于JavaFx WebEngine的自定义FunctionPlotter组件。我的情节将在浏览器中显示。在执行我的绘图命令之前,我必须等到浏览器初始化(它加载d3.js)。目前我通过将我的绘图表达式放在Runnable中并将该runnable传递给FunctionPlotter来实现。 (FunctionPlotter将runnable传递给浏览器的加载完成挂钩):

private FunctionPlotter plotter;
...

Runnable plotRunnable = ()->{
    plotter.plot("x^2");
}

plotter = new FunctionPlotter(plotRunnable);

但是,我更愿意关注(阻止)工作流程以使用我的FunctionPlotter组件:

Functionplotter plotter = new FunctionPlotter();
plotter.plot("x^2")

=> FunctionPlotter应该自动等待包装的浏览器初始化。

我应该如何在JavaFx应用程序中执行此操作?

在FunctionPlotter中我可以做类似

的事情
private Boolean isInitialized = false
...

ReadOnlyObjectProperty<State> state =  webEngine.getLoadWorker().stateProperty();
state.addListener((obs, oldState, newState) -> {
    boolean isSucceeded = (newState == Worker.State.SUCCEEDED);
    if (isSucceeded) {
        isInitialized = true;
    }
});
webEngine.loadContent(initialBrowserContent);

waitUntilInitialLoadingIsFinished();

我的实际问题是如何实现最后一行的方法。如果我使用以下代码,应用程序将永远等待:

private void waitUntilBrowserIsInitialized() {
    while(!isInitialized){
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
        }
    }
}

我知道有像JavaFx Tasks,Platform.runLater(),Service,CountdownLatch(JavaFX working with threads and GUI这样的东西但是那些没有帮助我(=我没有让它工作)。如何在Runnable完成之前在主线程中等待?

这里有人说不应该阻止JavaFx应用程序线程:

Make JavaFX application thread wait for another Thread to finish

还有其他建议吗?

修改

相关问题:JavaFX/SWT WebView synchronous loadcontent()

1 个答案:

答案 0 :(得分:1)

我决定将绘图功能包装在绘图指令的内部队列中。命令

plotter.plot("x^2");

实际上不会执行绘图,而是向队列添加绘图指令。在初始化浏览器之后,将完成该队列并且将以延迟执行绘图命令。在浏览器初始化时,我将显示某种进度条。

如果您知道不需要延迟执行的解决方案,请告诉我们。