multithreading - 如何等待JavaFx应用程序中的WebEngine/浏览器初始化?

标签 multithreading browser javafx wait

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

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 Application线程永远不会被阻塞:

Make JavaFX application thread wait for another Thread to finish

还有其他建议吗?

编辑

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

最佳答案

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

plotter.plot("x^2");

不会实际执行绘图,而是将绘图指令添加到队列中。浏览器初始化后,该队列将被处理,并且plot命令将被延迟执行。在浏览器初始化期间,我将显示某种进度条。

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

关于multithreading - 如何等待JavaFx应用程序中的WebEngine/浏览器初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33971137/

相关文章:

css - 在中文浏览器中正确显示CSS字体

java - 当目标节点改变场景时,Ubuntu 上不会发生鼠标释放事件?

JavaFX:绘制无限符号并向前移动

java - 没有同步或 volatile 关键字的延迟初始化

c# - 线程与单线程

multithreading - 退出临界区

css - 链接 rel ="stylesheet"在 MSIE 中不起作用

python - 锁定实体以在 Google Cloud 数据存储区中执行获取更新设置操作

asp.net-mvc - 从 Web 应用程序中删除已保存的浏览器用户名和密码

java - 在 javafx 中选择不同选项卡时更改阶段 titleProperty