当前位置: 首页 > 知识库问答 >
问题:

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

湛嘉歆
2023-03-14

问题

我有一个大小适中的javaFX窗口,看起来运行良好,直到我调整应用程序中任何窗口的大小。调整后,具有下拉或类似操作的所有组件(即。菜单组合框TabPane)变得非常慢。

原因

我已经把问题缩小到一个进度条,如果我从场景中删除进度条,我可以随心所欲地调整窗口大小,如果我添加它,那么任何窗口都会调整大小,它们开始变得没有反应大约半秒钟;如果我做了很多调整大小,有时会长达两秒钟。

窗口

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

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

用进度条初始化

/**
 * 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
    }
}

附加说明

>

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

    许多广泛使用的组件,如<code>按钮

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

    我有一台游戏电脑,所以我的硬件应该不会有问题。

    Java版本:1.8.0_

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

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

    再现结果的 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个答案

    高琛
    2023-03-14

    问题似乎与此错误有关:

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

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

     类似资料:
    • 我正在尝试构建一个包含6个窗格(作为父级添加到GridPane布局中)的简单Java项目。我必须在开始时设置窗口大小,并通过参考根布局的宽度和高度,设法将它们均匀地拆分。 但我想要他们调整大小,因为我改变了窗口的大小(使用鼠标,现在他们得到固定的大小)。 下面是我的代码:

    • 我刚开始使用JavaFX,问题是,在更改场景后,并非所有组件都被显示。例如,我有一个GridPane,它将被添加到边框中心,一个标签将被添加到边框底部。但是在我更改场景后,这个标签不会显示,只有在调整大小后才有效。 以下是一个简单的最小、完整和可验证的示例:

    • 我的场景中有一个对象。我希望能够调整窗口的大小,并与它一起调整窗格的大小。我还想在窗格旁边放置一个。 到目前为止,我已经成功地生成了一个完全可调整大小的或一个,其中包含和对象,但当我调整窗口大小时,窗格不会随之调整大小。 以下是带有锚烷的FXML: 只有的版本基本上就是版本中使用的代码,但具有和属性。 如何制作一个场景,使其具有可调整大小的和?

    • 我有下面的代码,它设置了一个特定大小的窗口。它还从外部URL加载图像。

    • 窗口大小,我们可以非常方便的使用width、height调整,但是如何知道 width和height是一个问题? 在 Window 操作系统中,假如我们想要缩放,我们通常会把鼠标移动到窗口的右边栏,和底部边栏,以及右下边栏。 而且在不同的边栏,鼠标呈现的样式也是不一样的。当我们在右边栏的时候我们可以通过cursor: e-resize;模拟鼠标样式。 在底部边栏我们可以通过cursor: s-re

    • #include <stdio.h> void fun1(void) { int i = 0; i++; i = i * 2; printf("%d\n", i); } void fun2(void) { int j = 0; fun1(); j++; j = j