如何在 JavaFx 应用程序中等待 WebEngine/Browser 初始化?
How to wait for WebEngine/Browser initialization in JavaFx application?
我想创建一个基于 JavaFx WebEngine 的自定义 FunctionPlotter 组件。我的情节将显示在浏览器中。在我执行我的绘图命令之前,我必须等到浏览器被初始化(它加载 d3.js)。目前,我通过将绘图表达式放入 Runnable 并将该 runnable 传递给 FunctionPlotter 来实现。 (FunctionPlotter将runnable传递给浏览器的loading finished 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");
不会实际执行绘图,而是将绘图指令添加到队列中。浏览器初始化后,将处理该队列并延迟执行绘图命令。当浏览器正在初始化时,我将显示某种进度条。
如果您知道不需要延迟执行的解决方案,请告诉我。
我想创建一个基于 JavaFx WebEngine 的自定义 FunctionPlotter 组件。我的情节将显示在浏览器中。在我执行我的绘图命令之前,我必须等到浏览器被初始化(它加载 d3.js)。目前,我通过将绘图表达式放入 Runnable 并将该 runnable 传递给 FunctionPlotter 来实现。 (FunctionPlotter将runnable传递给浏览器的loading finished 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");
不会实际执行绘图,而是将绘图指令添加到队列中。浏览器初始化后,将处理该队列并延迟执行绘图命令。当浏览器正在初始化时,我将显示某种进度条。
如果您知道不需要延迟执行的解决方案,请告诉我。