Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
FXML解析太慢时JavaFX中的忙弹出窗口_Java_Javafx_Javafx 8_Fxml_Fxmlloader - Fatal编程技术网

FXML解析太慢时JavaFX中的忙弹出窗口

FXML解析太慢时JavaFX中的忙弹出窗口,java,javafx,javafx-8,fxml,fxmlloader,Java,Javafx,Javafx 8,Fxml,Fxmlloader,FXML性能是JavaFX的一个问题,如果您有复杂的屏幕,并且将它们划分为使用FXML的小组件(为了可维护性/重用),那么它会变得非常慢 由于FXML解析是在UI线程中进行的(不确定这一点,它仍然会阻止JavaFX应用程序线程),因此在处理FXML时,您无法在JavaFX中显示glasspane/popup/etc 我发现的唯一解决方法是在加载FXML时使用Swing弹出窗口(因为它在Swing UI线程中,您仍然可以显示一些内容)向用户提供反馈(它正在工作/不是错误/稍等),并在不再解析FXM

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

由于FXML解析是在UI线程中进行的(不确定这一点,它仍然会阻止JavaFX应用程序线程),因此在处理FXML时,您无法在JavaFX中显示glasspane/popup/etc

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

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

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

推荐的解决方案

使用JavaFX8U40+,您可以找到一个

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

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

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

您还可以在应用程序的函数中加载FXML,以便在JavaFX系统启动时并行加载FXML(您需要注意线程化,以确保在加载所有FXML并在JavaFX应用程序线程上执行显示场景的操作之前,不会真正尝试显示场景)

替代溶液


您也可以尝试此解决方案,然后可能不会出现FXML加载缓慢的问题(因为不再有任何FXML,它已转换为Java)。但我不知道该解决方案目前是否足够成熟和稳定,以满足您的需要。

谢谢,我会尝试一下。编译FXML有很多问题,它会生成使用不推荐的生成器API的代码。此外,fx:root似乎与它不兼容。它可以工作。非常好。我将看看现在如何处理F的异步构建XML组件。