Я делаю чат-приложение с использованием JavaFX для графического интерфейса. Я показываю содержимое чата в ListView, но у меня одна большая проблема - это очень медленно. Когда я добавляю новые элементы в список и особенно когда я просматриваю список вверх/вниз. Я думаю, возможно, это связано с тем, что список обновляет itsellf каждый раз, когда добавляется новый элемент (каждая ячейка в списке!), А также обновляется каждый раз, когда я просматриваю вверх/вниз. Кто-нибудь знает, что я могу сделать для решения этой проблемы? TNXJavaFX ListView очень медленный
Я переопределить updateItem ListCell в:
chatListView.setCellFactory (новый обратный вызов, ListCell>() { @Override ListCell вызов общественности (ListView р) { ListCell клетка = новый ListCell() { @Override защищен недействительным updateItem (UserInfo пункт, булево млрд) { super.updateItem (пункт, млрд);
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;
}
});
Вы должны включать в себя [mcve] (http://stackoverflow.com/help/mcve), в противном случае ваш вопрос эффективно неопровержимый. – jewelsea
Да, пожалуйста, укажите пример кода. Вы переопределяете метод «updateItem» ListCell? Вы делаете что-нибудь дорогое там? [Безвоздушный] (https://github.com/TomasMikula/Flowless) может или не поможет в вашей ситуации. –
Я добавил код^ – Yael