JavaFX进度条在resize后会导致严重的窗口延迟

问题

我有一个体面大小的javaFX窗口似乎很好地工作,直到我调整应用程序中的任何窗口的大小。 resize后,所有具有下拉或类似操作的组件(即MenuComboBoxTabPane )变得非常慢。

原因

我已经把问题缩小到一个进度条,如果我从场景中删除进度条,我可以调整窗口的大小,如果我想添加它,然后任何窗口resize,他们开始变得没有反应半秒钟 有时甚至有两秒钟,如果我做了很多resize。

窗户

窗口的视图,以便您可以看到所有组件。

带进度条的窗口

我不能添加所有的窗口代码,因为它太简单了。

与进度条类

 /** * The class that holds and displays the progress bar */ public class BottomToolBarImpl extends ToolBar { /** * The label that display the "Waiting for input" text at the bottom of the * window * * The {@code LLabel()} class is a label that gets its text from a * properties file */ private final Label text = new LLabel().setTextKey("waiting").register(); /** * This is the progress bar itself that is causing the problem */ private final ProgressBar progressBar = new ProgressBar(); /** * Constructs the tool bar and adds the components */ public BottomToolBarImpl() { super(); addItems(); } /** * Adds the progress bar and label the this object */ private void addItems() { Region r = new Region(); r.setMaxWidth(Double.MAX_VALUE); HBox.setHgrow(r, Priority.ALWAYS); progressBar.setMinWidth(192);//This line has no effect on the performance this.getItems().add(r); this.getItems().add(text); this.getItems().add(progressBar);//If i comment out this line then all works perfectly } } 

附加信息

  • 窗口上的大多数可见组件(即TableViewToolBarListView )都是实现。 我怀疑这是问题所在

  • 许多广泛使用的组件,如ButtonsLabels是实现一个接口,允许他们使用一个键,然后从文本的语言文件中获取键值的实现。 这在渲染方面没有太多的工作,也不经常被调用,所以我也怀疑这是问题所在。

  • 窗口启动相当快(不到一秒钟)。

  • 我有一台游戏机,所以我的硬件不应该是一个问题。

  • Java版本:1.8.0_40(build 1.8.0_40-b25)64位

我想我在这里问的是有任何其他身体有这个问题,如果是的话,你是如何解决它?
你知道这个问题可能是什么吗? 我不认为这是一个错误,因为谷歌没有任何/许多结果。

任何帮助将不胜感激,因为我完全卡在这里。

重现结果的麦克风

 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.control.Menu; import javafx.scene.control.MenuBar; import javafx.scene.control.MenuItem; import javafx.scene.control.ProgressBar; import javafx.scene.control.ToolBar; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Main extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) throws Exception { primaryStage.setTitle("Reproduce problem"); final StackPane root = new StackPane(); primaryStage.setScene(new Scene(root, 500, 400)); final VBox layout = new VBox(10); layout.getChildren().addAll(new MenuImpl(), new ProgressToolBar()); root.getChildren().add(layout); primaryStage.show(); } private class ProgressToolBar extends ToolBar { private final Label text = new Label("Random Text Here"); private final ProgressBar progressBar = new ProgressBar(); public ProgressToolBar() { super(); addItems(); } private void addItems() { Region r = new Region(); r.setMaxWidth(Double.MAX_VALUE); HBox.setHgrow(r, Priority.ALWAYS); progressBar.setMinWidth(192); this.getItems().add(r); this.getItems().add(text); this.getItems().add(progressBar); //Still causes the problem } } private class MenuImpl extends MenuBar { public final Menu FILE = new Menu("File", null, new MenuItem("A"), new MenuItem("B"), new MenuItem("C")); public MenuImpl() { super(); this.getMenus().addAll(FILE); } } } 

点击“文件”菜单,在调整窗口大小之前和之后滚动浏览项目。

这个问题似乎与这个bug有关:

[Windows]使用动画时,应用程序(或菜单)的性能非常差 。

作为解决方法,使用-Dprism.vsync=false-Dprism.order=sw作为VM参数运行程序。