调整大小后,JavaFX进度条会导致严重的窗口滞后

时间:2015-10-05 10:39:31

标签: java windows javafx progress-bar

问题

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

原因

我已将问题缩小到进度条,如果我从场景中删除进度条我可以根据需要调整窗口大小,如果我添加它然后任何窗口调整大小并且它们开始变为大约半秒钟没有反应;如果我做了很多调整大小,有时会多达两秒钟。

窗口

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

The window with the progress bar

我无法添加所有窗口代码,因为它的发布方式太多了。

带进度条的课程

/**
 * 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(版本1.8.0_40-b25)64位


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

任何帮助都会受到赞赏,因为我完全被困在这里。

重现结果的mcve

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);
        }
    }
}

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

1 个答案:

答案 0 :(得分:3)

问题似乎与此错误有关:

[Windows] Very poor performance of application (or Menus) when using an Animation

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