当前位置: 首页 > 知识库问答 >
问题:

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

太叔凌龙
2023-03-14

我想创建一个基于JavaFx WebEngine的自定义FunctionPlotter组件。我的情节将在浏览器中显示。在执行plot命令之前,我必须等待浏览器初始化(它加载d3.js)。目前,我这样做的方法是将我的绘图表达式放入一个Runnable中,并将该Runnable传递给FunctionPlotter。(FunctionPlotter将runnable传递给浏览器的loading finished钩子):

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任务、platform.runlater()、Service和CountdownLatch(JavaFx处理线程和GUI)等东西,但这些东西对我没有帮助。我如何在主线程中等待直到一个Runnable完成?

这里有人说JavaFx应用程序线程永远不应该被阻塞:

使JavaFX应用程序线程等待另一个线程完成

还有其他建议吗?

编辑

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

共有1个答案

樊令秋
2023-03-14

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

plotter.plot("x^2");

将不实际执行plot,而是向队列中添加plot指令。在初始化浏览器之后,将通过该队列,并延迟执行plot命令。当浏览器初始化时,我将显示某种进度条。

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

 类似资料:
  • 我正在用JavaFX开发一个数据挖掘应用程序,它依赖于WebView(因此也依赖于WebEngine)。挖掘分两步进行:首先,用户使用UI导航到WebView中的一个网站,以配置可以在哪里搜索感兴趣的数据。其次,使用定期运行的后台任务,WebEngine加载相同的文档,并尝试从加载的文档中提取数据。 这种方法在大多数情况下都能很好地工作,但是最近我遇到了一些使用AJAX呈现内容的页面的麻烦。为了检

  • 你好,我在JavaFX应用程序中遇到了一个很大的问题,当所有浏览器窗口关闭时,会终止java进程。我试图处理stage.setonhidding或.setoncloseRequest,终止所有正在运行的线程,并在处理程序主体中执行platform.exit,但没有成功。首先,当我关闭浏览器时,没有调用任何处理程序setonHidding和setOnCloseRequest。此外,设置platfor

  • 我想暂停在JavaFX应用程序线程上执行方法并等待用户与UI交互。不要冻结UI很重要。 例子: 我应该如何实现< code>pause()和< code>resume()方法?< br >事件处理程序的执行应在< code>pause()处等待;调用,直到用户按下< code>resume按钮并且调用< code>resume方法。

  • 问题内容: 我试图在Java中使用phantomjsdriver构建Webspider。我正在使用Selenium版本3.11.0,PhantomJS 2.1.1和phantomjsdriver版本1.2.1。当我执行代码时,出现以下错误消息。 线程“主”中的异常java.lang.NoSuchMethodError:org.openqa.selenium.os.CommandLine.find(

  • 我正在尝试从JavaFX应用程序中创建一个JFrame窗口。我正在使用Oracle Java 8,我能够在Linux,Windows中做我需要的事情,但在Mac OS中却不能。这似乎是一个JVM实现问题。以下是我的要求: 我需要调用一个创建游戏窗口的库方法(JFrame的扩展类)。我需要能够在游戏中使用键盘。 我可以访问库的源代码但无意更改库的源代码 我需要在游戏结束后处理游戏信息,所以我的主线程

  • 问题内容: 有一个超链接。单击后,我希望在外部浏览器中打开链接。 网络上引用的常用方法似乎是: 但是我没有提及。该链接是从对话框打开的,该对话框是从控制器打开的,而该对话框是通过fxml文件打开的,因此获得对Application对象的引用将非常痛苦。 有人知道这样做的简单方法吗? 干杯 问题答案: 解决方案1:通过您的应用程序向下传递引用。 这可能类似于您预期的“非常痛苦”的方法。但基本上,您会