java - 当 FXML 解析太慢时,JavaFX 中的繁忙弹出窗口

标签 java javafx javafx-8 fxml fxmlloader

FXML 性能是 JavaFX 的一个问题,如果您有复杂的屏幕并将它们分成使用 FXML 的小组件(为了可维护性/重用),那么它会变得非常慢。

由于 FXML 解析是在 UI 线程中进行的(不确定这一点,它仍然会阻塞 JavaFX 应用程序线程),因此在处理 FXML 时,您无法在 JavaFX 中显示玻璃 Pane /弹出窗口等。

我发现的唯一解决方法是使用 Swing 弹出窗口(因为它在 Swing UI 线程中,您仍然可以显示一些内容)向用户提供反馈(它正在工作/不是错误/再等一会儿)当加载 FXML 时并在不再解析 FXML 文件时关闭它。

我在 FXMLLoader 之上构建了一个外观来执行此操作。此外,这也适用于 OpenGL 库(例如,LWJGL,而不是 Swing,任何 UI 且不在 JavaFX 应用程序线程中的东西都可以工作)。

我想知道是否存在更好的解决方案(仅限 JavaFX,不混合 UI 框架),因为这人为地增加了项目的复杂性,并且无法很好地与 OpenJFX 端口一起移植。

最佳答案

推荐解决方案

使用JavaFX 8u40+,可以找到early access release .

对于 8u40,修复了以下错误:

此修复允许您从 JavaFX 应用程序线程创建所有控件(当前 WebView 除外)。这意味着您可以将 FXML 异步加载到标准 JavaFX Task 内的 JavaFX 应用程序线程。 。当任务运行时,您可以显示一个请等待对话框或显示动画进度指示器或任何您喜欢的内容(在 JavaFX 中,无需使用 Swing/LWJGL 等其他框架)。

我最喜欢的处理这个问题的方法是在用户显示登录提示或需要创建一些输入时加载 FXML 元素(但无论您是否使用“在等待用户输入时在后台加载内容”技巧)取决于应用程序)。

您还可以在 init 中加载 FXML您的应用程序的功能,以便 FXML 与 JavaFX 系统启动并行加载(为此您需要稍微注意线程,以确保在加载所有 FXML 之前您不会真正尝试显示场景并且显示场景的操作发生在 JavaFX 应用程序线程上)。

替代解决方案

您也可以尝试此解决方案 Convert FXML to Java as part of the build ,那么也许就不会出现FXML加载缓慢的问题了(因为不再有FXML了,它已经转换为Java了)。但我不知道该解决方案目前是否足够成熟和稳定,足以满足您的目的。

关于java - 当 FXML 解析太慢时,JavaFX 中的繁忙弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27290158/

相关文章:

java - 如何在 Javafx 的堆栈 Pane 中播放媒体?

java - 我如何检查该条目是否已存在于表中或 servlet 中

java - 使用 JavaFX 和 Gluon,单击按钮时如何从登录页面更改为主菜单?

JavaFX 阶段*有时*在 Win10 上显示为空白

javafx-8 - JavaFX 虚拟键盘不显示

java - 为什么我不能在 Maven 中构建 jar

java - CardLayout 的父容器/面板

java - "?:"运算符是 scala

Java 串行通信 -> EventListener 问题

java - JavaFX 中的 TableView : how to change a single cell's background color if a TableCellTextField is being used?