我想创建一个GridPane(嵌套在ScrollPane中),我将动态单元格添加到GridPane。每个单元格都包含一个带有BackgroundImage的VBox,一些标签和一个复选框。问题是,GridPane可以包含几百个VBox,在我的例子中有大约300个VBox,并且有很多VBox,Gridpane的响应时间变得非常糟糕。当我在CheckBox上单击时,它需要几秒钟,直到选中/取消选中CheckBox,这使得我的程序几乎无法使用。没有BackgroundImage,GridPane的响应时间是完美的,所以我知道这里的问题是图像
这是我创建VBox的代码:
private VBox createAlbumVBox(Album album) {
VBox container = new VBox();
container.setAlignment(Pos.BOTTOM_LEFT);
CheckBox checkBox = new CheckBox();
Label labelAlbum = new Label(album.getName());
Label labelArtist = new Label(album.getArtistName());
labelAlbum.setStyle("-fx-text-fill: #272727");
labelArtist.setStyle("-fx-text-fill: #272727");
Background background;
if(album.getCover() != null)
{
byte[] coverData = album.getCover();
Image image = new Image(new ByteArrayInputStream(coverData));
BackgroundSize bg = new BackgroundSize(100,100,true,true,true,false);
BackgroundImage backgroundImage = new BackgroundImage(image,BackgroundRepeat.NO_REPEAT,BackgroundRepeat.NO_REPEAT,BackgroundPosition.CENTER,bg);
background = new Background(backgroundImage);
}
else
{
Image image = new Image("/ressources/covers/default-cover.png");
BackgroundSize bg = new BackgroundSize(100,100,true,true,true,false);
BackgroundImage backgroundImage = new BackgroundImage(image,BackgroundRepeat.NO_REPEAT,BackgroundRepeat.NO_REPEAT,BackgroundPosition.CENTER,bg);
background = new Background(backgroundImage);
}
checkBox.setOnMouseClicked(e -> {
if (checkBox.isSelected()) {
album.getTitles().forEach(t -> t.setReadyToSync(true));
} else {
album.getTitles().forEach(t -> t.setReadyToSync(false));
}
});
container.setBackground(background);
HBox hBox = new HBox();
hBox.getChildren().addAll(labelAlbum, labelArtist, checkBox);
hBox.setPrefHeight(30);
hBox.setStyle("-fx-background-color: rgba(255, 255, 255, 0.4)");
container.getChildren().addAll(hBox);
return container;
}
我已经尝试使用ImageView而不是BackgroundImage。不幸的是,使用ImageView的性能与使用BackgroundImage一样差。
答案 0 :(得分:1)
这不是一个真正的答案,而是您可以尝试的一系列建议。如果没有完整的mcve,就很难评论性能问题,这样可以在最小的应用程序中轻松地在本地重现这些问题。
您可以尝试的一些事情是:
另请参阅相关答案中的一些性能优化建议(其中一些可能不适用于您的情况):
此外,您的问题可能出在您未展示的代码中。您的例程正在传递一个Album实例,其中包括专辑数据,包括二进制形式的图像数据。如果您动态地从数据库加载相册数据和图像,则该过程可能会降低或冻结您的应用程序,具体取决于您的操作方式。