我正在使用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
。