gpt4 book ai didi

Gridpane 中的 JavaFx 图像显着降低性能

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:54:18 24 4
gpt4 key购买 nike

我想创建一个 GridPane(嵌套在 ScrollPane 中),我在其中向 GridPane 动态添加单元格。每个单元格都包含一个带有背景图像的 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 一样差。

最佳答案

这不是真正的答案,而是您可以尝试的一组建议。没有完整的 mcve 就很难对性能问题发表评论,这样就可以在最小的应用程序中轻松地在本地重现问题。


您可以尝试的一些事情是:

  1. Use background loading for your images .
  2. Cache loaded images in a LRU cache .
  3. 使用虚拟化控件,例如 ControlsFX GridView .

另请参阅相关答案中的一些性能优化建议(其中一些可能不适用于您的情况):


此外,您的问题可能出在您未显示的代码中。您的例程正在传递一个 Album 实例,其中包含相册数据,包括二进制形式的图像数据。如果您从数据库动态加载您的相册数据和图像,那么该过程可能会减慢或卡住您的应用程序,具体取决于您的操作方式。

关于Gridpane 中的 JavaFx 图像显着降低性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36318197/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com