FXML性能是JavaFX的一个问题,如果你有复杂的屏幕并将它们分成使用FXML的小组件(可维护性/重用),那么它可能变得非常慢。
由于FXML解析是在UI线程中完成的(不确定这一点,它仍会阻止JavaFX应用程序线程),因此在处理FXML时,您无法在JavaFX中显示glasspane / popup /等。
我找到的唯一解决方法是使用Swing弹出窗口(因为它在Swing UI Thread中,你仍然可以显示一些东西)来向用户提供反馈(它正在工作/不是bug /等一下)当加载FXML并在不再解析FXML文件时关闭它。
我在FXMLLoader之上构建了一个外观来实现这一目标。此外,这也适用于OpenGL库(例如LWJGL,而不是Swing,任何UI,而不是JavaFX Application Thread的工作原理)。
我想知道是否存在更好的解决方案(仅限JavaFX,不混合UI框架),因为这会人为地增加项目的复杂性,并且不会很好地移植到OpenJFX端口。
答案 0 :(得分:2)
推荐的解决方案
使用JavaFX 8u40 +,您可以找到early access release。
对于8u40,修复了以下错误:
此修复程序允许您从JavaFX应用程序线程创建所有控件(当前是WebView除外)。这意味着您可以在标准JavaFX Task内异步加载FXML到JavaFX应用程序线程。当任务正在运行时,您可以显示请等待对话框或动画进度指示器或您喜欢的任何内容(在JavaFX中,不需要使用其他框架,如Swing / LWJGL)。
我最喜欢的处理方式是在用户显示登录提示或需要创建一些输入时加载FXML元素(但是否在等待用户时使用"在后台加载东西输入"技巧取决于应用程序。)
您还可以在应用程序的init函数中加载FXML,以便FXML与启动的JavaFX系统并行加载(您需要注意线程,以确保在加载所有FXML并在JavaFX应用程序线程上发生显示场景的操作之前,你实际上并没有尝试显示你的场景。
替代解决方案
你也可以尝试这个解决方案到Convert FXML to Java as part of the build,然后可能不会有任何加速FXML的问题(因为不再有任何FXML,它已被转换为Java)。但我不知道该解决方案目前是否已成熟且足够稳定以满足您的目的。