jjzjj

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

coder 2024-06-10 原文

问题

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

原因

我已将问题缩小到进度条,如果我从场景中删除进度条,我可以根据需要调整窗口的大小,如果我添加它,那么任何窗口都会调整大小,它们开始变成大约半秒钟没有反应;如果我进行大量调整,有时需要两秒钟。

窗口

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

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

带进度条的类

/**
 * 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 都是实现接口(interface)的实现,该接口(interface)允许它们使用 key ,然后获取 key 语言文件中文本的值。这在渲染方面没有太大作用,也不经常调用,所以我也怀疑这是问题所在。

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

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

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

单击"file"菜单并滚动浏览调整窗口大小前后的项目。

最佳答案

问题似乎与这个错误有关:

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

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

关于JavaFX 进度条在调整大小后导致严重的窗口滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32946564/

有关JavaFX 进度条在调整大小后导致严重的窗口滞后的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  3. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  4. ruby-on-rails - Ruby 中意外的大小写行为 - 2

    我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。

  5. ruby - (Ruby || Python) 窗口管理器 - 2

    我想用这两种语言中的任何一种(最好是ruby​​)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生

  6. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

  7. ruby - 改变替换的大小写 - 2

    我有以下内容:text.gsub(/(lower)(upper)/,'\1\2')我可以将\2替换为大写吗?类似于:sed-e's/\(abc\)/\U\1/'这在Ruby中可行吗? 最佳答案 查看gsub文档:str.gsub(模式){|匹配|block}→new_str在block形式中,当前匹配字符串作为参数传入,$1、$2、$`、$&、$'等变量将被适当设置。block返回的值将替换为每次调用的匹配项。"alowerupperb".gsub(/(lower)(upper)/){|s|$1+""+$2.upcase}

  8. ruby - 从另一个私有(private)方法中使用 self.xxx() 调用私有(private)方法 xxx,导致错误 "private method ` xxx' called” - 2

    我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是

  9. ruby - 为什么 return 关键字会导致我的 'if block' 出现问题? - 2

    下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson

  10. ruby-on-rails - 什么会导致与 APNS 的连接间歇性断开连接? - 2

    我有一个ruby​​脚本可以打开与Apple推送服务器的连接并发送所有待处理的通知。我看不出任何原因,但当Apple断开我的脚本时,我遇到了管道损坏错误。我已经编写了我的脚本来适应这种情况,但我宁愿只是找出它发生的原因,这样我就可以在第一时间避免它。它不会始终根据特定通知断开连接。它不会以特定的字节传输大小断开连接。一切似乎都是零星的。您可以在单个连接上发送的数据传输或有效负载计数是否有某些限制?看到人们的解决方案始终保持一个连接打开,我认为这不是问题所在。我看到连接在3次通知后断开,我看到它在14次通知后断开。我从未见过它能超过14点。有没有人遇到过这种类型的问题?如何处理?

随机推荐