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

我重写ListCell的updateItem:

chatListView.setCellFactory(新的回调,ListCell>(){
            @Override
            公开ListCell调用(ListView p){
                ListCell单元格=新的ListCell(){
                    @Override
                    受保护的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;
        }
    });

最佳答案

切勿在updateItem()中添加(大)GUI元素,除非检查它是否还不存在。


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

我建议您使用VBox代替ListView

08-04 23:28