【问题标题】:How to wait for WebEngine/Browser initialization in JavaFx application?如何在 JavaFx 应用程序中等待 WebEngine/Browser 初始化?
【发布时间】:2016-03-02 11:13:27
【问题描述】:

我想创建一个基于 JavaFx WebEngine 的自定义 FunctionPlotter 组件。我的绘图将显示在浏览器中。在我执行我的绘图命令之前,我必须等到浏览器被初始化(它加载 d3.js)。目前,我通过将绘图表达式放在 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()

【问题讨论】:

    标签: multithreading browser javafx wait


    【解决方案1】:

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

    plotter.plot("x^2");
    

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

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

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 2020-11-01
      • 1970-01-01
      • 2017-11-12
      • 2014-12-28
      相关资源
      最近更新 更多