2014-12-04 82 views
1

FXML性能與JavaFX的一個問題,如果你有複雜的屏幕和他們使用FXML已經分成小的組件(可維護性/再利用),那麼它可以變得很慢。忙彈出時FXML解析太慢

由於FXML解析是在UI線程中完成的(不確定這是否仍然阻塞了JavaFX應用程序線程),所以在FXML處理過程中無法在JavaFX中顯示glasspane/popup/etc。

我發現的唯一解決方法是使用Swing彈出窗口(因爲它在Swing UI線程中,您仍然可以顯示某些內容)向用戶提供反饋(它正在工作/不是bug /稍微多點)當FXML被加載時,並在沒有更多的FXML文件被解析時關閉它。

我已經建立了上述FXMLLoader一個門面做。此外,這也適用於OpenGL庫(例如LWJGL,而不是Swing,任何是UI且不在JavaFX應用程序線程中的作品)。

我在想,如果一個更好的解決方案存在(JavaFX的唯一,不是混合UI框架),因爲這人爲地增加了複雜性的項目,不會的OpenJFX端口被移植好。

回答

2

推薦的解決方案

使用JavaFX的8u40 +,你可以找到一個early access release

對於8u40,下面的錯誤是固定的:

此修復程序允許您創建的所有控件(除了當前網頁視圖)關閉了JavaFX應用程序線程。這意味着您可以將FXML異步加載到標準JavaFX Task內的JavaFX應用程序線程。當任務正在運行時,您可以有一個請等待的對話框或動畫進度指示器或任何你喜歡的東西(在JavaFX中,不需要使用其他框架,如Swing/LWJGL)。

我最喜歡的處理方法是在用戶顯示登錄提示或需要創建輸入時加載FXML元素(但是不管您是否使用「在等待用戶輸入時在後臺加載內容」技巧是應用程序依賴)。

您也可以加載FXML在應用程序的init功能,使FXML被加載在平行於JavaFX的系統啓動(你需要照顧周圍穿線位爲確保你不」實際上試圖展示你的場景,直到所有的FXML被加載,並且在JavaFX應用程序線程中發生顯示場景的操作)。

替代的解決方案

您也可以嘗試這個解決方案Convert FXML to Java as part of the build,那麼也許就不會有與FXML的加載速度慢的任何問題(因爲不再有任何FXML,它已被轉換爲Java )。但我不知道該解決方案目前是否已經足夠成熟和穩定。

+0

謝謝,我會試一試。編譯FXML有許多問題,例如,它會生成帶有不贊成使用的Builder API的代碼。另外fx:root似乎與它不兼容。 – zenbeni 2014-12-05 08:32:53

+0

它的工作原理。太好了。我將看到我現在可以使用異步構建的FXML組件來做什麼。 – zenbeni 2014-12-08 15:39:43