2014-12-04 26 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