2015-11-28 40 views
0

我想創建一個基於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()

回答

0

我決定在劇情指令的內部隊列包的情節功能。命令

plotter.plot("x^2"); 

將不會實際執行繪圖,但會向隊列添加繪圖指令。在瀏覽器初始化之後,該隊列將被處理並且繪圖命令將被延遲執行。瀏覽器初始化時,我會顯示某種進度條。

如果你知道一個解決方案,不需要這個延遲執行工作,請讓我知道。