【问题标题】:Busy popup in JavaFX when FXML parsing is too slow当 FXML 解析太慢时,JavaFX 中的繁忙弹出窗口
【发布时间】:2015-02-02 02:30:14
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java javafx javafx-8 fxml fxmlloader


    【解决方案1】:

    推荐解决方案

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

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

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

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

    您还可以在应用程序的 init 函数中加载 FXML,以便在 JavaFX 系统启动的同时加载 FXML(您需要注意线程化一点,以确保您没有'在加载所有 FXML 并且显示场景的操作发生在 JavaFX 应用程序线程上之前,实际上不会尝试显示您的场景。

    替代解决方案

    您也可以尝试Convert FXML to Java as part of the build的这个解决方案,那么FXML加载缓慢可能不会有任何问题(因为不再有任何FXML,它已被转换为Java)。但我不知道该解决方案目前是否成熟且稳定,足以满足您的目的。

    【讨论】:

    • 谢谢,我试试。编译 FXML 有很多问题,例如它使用已弃用的 Builder API 生成代码。 fx:root 似乎也与它不兼容。
    • 它有效。太好了。我将看看我现在可以用 FXML 组件的异步构建做什么。
    猜你喜欢
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多