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

JavaFX ListView非常慢

洪胤
2023-03-14

我正在为GUI制作一个使用JavaFX的聊天应用程序。我在列表视图中显示聊天内容,但我有一个大问题--它非常非常慢。当我向列表中添加新项目时,尤其是当我向上/向下滚动列表时。我想可能与每次添加一个新项(列表中的每个单元格!)时列表都会刷新itsellf这一事实有关吧!并在每次向上/向下滚动时刷新。有人知道我能做什么来解决这个问题吗?TNX

我重写ListCell得UpdateItem:

chatListView.setCellFactory(new Callback<ListView<UserInfo>, ListCell<UserInfo>>() {
            @Override
            public ListCell<UserInfo> call(ListView<UserInfo> p) {
                ListCell<UserInfo> cell = new ListCell<UserInfo>() {
                    @Override
                    protected void updateItem(UserInfo item, boolean bln) {
                        super.updateItem(item, bln);

                        if (item != null) {
                            BorderPane borderPane = new BorderPane();
                            ImageView profileImage = new ImageView(new Image(item.getImageURL()));
                            profileImage.setFitHeight(32);
                            profileImage.setFitWidth(32);

                            Rectangle clip = new Rectangle(
                                    profileImage.getFitWidth(), profileImage.getFitHeight()
                            );
                            clip.setArcWidth(30);
                            clip.setArcHeight(30);
                            profileImage.setClip(clip);
                            SnapshotParameters parameters = new SnapshotParameters();
                            parameters.setFill(Color.TRANSPARENT);
                            WritableImage image = profileImage.snapshot(parameters, null);
                            profileImage.setClip(null);
                            profileImage.setImage(image);

                            ImageView arrowImage = new ImageView(new Image("arrow1.png"));
                            ImageView arrowImage2 = new ImageView(new Image("arrow1.png"));
                            Label nameLabel = new Label(item.getUserName());
                            nameLabel.setStyle(" -fx-text-alignment: center; -fx-padding: 2;");

                            HBox hbox = null;
                            Label textLabel = new Label();
                            String messageText = splitTolines(item.getMessage());
                            textLabel.setText(messageText);
                            textLabel.setStyle("-fx-background-color: #a1f2cd; "
                                    + "-fx-padding: 10;\n"
                                    + "-fx-spacing: 5;");
                            hbox = new HBox(arrowImage, textLabel);

                            VBox vbox = new VBox(profileImage, nameLabel);
                            BorderPane.setMargin(vbox, new Insets(0, 10, 10, 10));
                            BorderPane.setMargin(hbox, new Insets(10, 0, 0, 0));

                            //Time
                            Date dNow = new Date();
                            SimpleDateFormat ft = new SimpleDateFormat("hh:mm a");
                            Label timeLabel = new Label(ft.format(dNow));
                            timeLabel.setStyle("-fx-font: 8px Tahoma;  -fx-width: 100%");

                            HBox hbox2 = new HBox(arrowImage2, timeLabel);
                            arrowImage2.setVisible(false);
                            VBox vbox2 = new VBox(hbox, hbox2);

                            borderPane.setCenter(vbox2);
                            borderPane.setLeft(vbox);
                            setGraphic(borderPane);
                        }
                    }
                };

                return cell;
            }
        });

共有1个答案

彭存
2023-03-14

>

  • 千万不要在updateItem()添加(大的)GUI元素而不检查它是否已经存在。

      滚动、调整gui大小或以任何其他方式更改gui时,每次都会对每一行调用
    1. updateItem()
    2. 如果没有项,或者updateItem(item,empty)的第二个布尔值为false,则应始终将图形重置为null,因为第二个布尔值是空标志。

    我建议您使用VBox而不是ListView

  •  类似资料:
    • 我正在尝试新的Python Interactive Broker API,但我在第一步遇到了一些严重的速度问题... 下面的代码(见下文)重复了两次 直到数据被接收完毕 直到应用程序完全断开连接。。。 为什么这么慢?最好的加速方法是什么? 我还试图在后台持续运行它,以便只在运行时提交请求 但速度也非常慢。有什么建议吗

    • 问题内容: 我很想使用BrowserSync进行开发。但是,页面加载(不仅是更改后重新加载)非常慢。 我使用模式。在没有BrowserSync的情况下浏览网页的速度应该很快。 原因之一可能是我安装BrowserSync时出现以下错误: 我从头开始安装节点(使用和软件包安装程序),但无法摆脱错误。 此外,如果使用Gulp或在命令行上运行BrowserSync,也没有什么不同。 任何想法? 问题答案:

    • 我搜索了数据库和食谱,但似乎找不到正确的答案。我有一个非常简单的python代码,它总结了一个范围内的自我权力。我需要这个非常非常大的数字的最后十位,我已经尝试了get上下文(). prec,但是我仍然达到了极限。 代码如下: 我怎么能看到这些美丽的数字?它在我的四核上打印速度相对较快。这只是为了给ProjectEuler带来乐趣,问题#48,请不要破坏者。我不想要解决方案,也不想让工作为我完成,

    • 非常道CSS框架是一个国内开源CSS框架,它具有良好的规范性、兼容性、易用性。除了框架有一个良好的展示效果外,还规划了一套比较合理的自定义CSS入库规则,这使得这套框架可以更好的满足一些使用者的CSS定制需求。最后也是最重要的一点,它还处在测试阶段,你的支持和意见将会就是我们坚持的动力,让我们一起使它更加完善,在此感谢! 在线演示:http://www.icsser.com/feichangdao

    • 问题内容: 一些背景信息:我想在Red Hat服务器上运行脚本以从/ dev / random中读取一些数据,并使用Perl unpack()命令将其转换为十六进制字符串,以备后用(基准数据库操作)。我在/ dev / random上运行了一些“ head -1”,它看起来工作得很好,但是多次调用后,它还是会挂起。几分钟后,它将最终输出一小段文本,然后结束。 我切换到/ dev / urandom

    • 问题内容: 这是我用来填写QT Designer中绘制的表格的代码。设计为对任何表通用,它可以正常工作,但是…当我尝试显示包含18列和〜12000行的datasat时,它冻结30秒或更长时间。因此,我做错了什么,有没有办法加快速度,保持代码仍然适合任何表? 那是我的代码: 问题答案: 这里是一个测试脚本,它比较了几种填充表格的方法。 自定义模型要快得多,因为它不必先创建所有项- 但请注意,这是一个