我想創建一個基於JavaFx WebEngine的自定義FunctionPlotter組件。我的地塊將顯示在瀏覽器中。在執行我的繪圖命令之前,我必須等待瀏覽器初始化完成(它會加載d3.js)。目前我通過將我的繪圖表達式放在Runnable中並將可運行的函數傳遞給FunctionPlotter來實現。 (該FunctionPlotter傳遞可運行到裝載完成了瀏覽器的鉤):如何等待JavaFx應用程序中的WebEngine/Browser初始化?
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(),服務,CountdownLatch(JavaFX working with threads and GUI),但這些並沒有幫助我(=我沒有得到它的工作)。如何在主線程中等待直到Runnable完成?
這裏有人說,JavaFX應用程序的線程不應該被阻止:
Make JavaFX application thread wait for another Thread to finish
任何其他建議?
編輯
相關問題:JavaFX/SWT WebView synchronous loadcontent()