2016-03-30 6 views
3

Я хочу создать GridPane (который вложен в ScrollPane), где я добавляю динамически ячейки в GridPane. Каждая ячейка содержит VBox с BackgroundImage, несколько ярлыков и флажок. Проблема состоит в том, что GridPane может содержать несколько сотен VBox, в моем случае около 300 VBoxes, и с этим большим количеством VBoxes время ответа Gridpane становится очень низким. Когда я нажимаю, например, на CheckBox, требуется несколько секунд, пока CheckBox не будет выбран/не выбран, что делает мою программу довольно непригодной для использования. Без BackgroundImage время отклика GridPane совершенно, так что я знаю, что проблема здесь ИзображенияИзображения JavaFx в 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.

ответ

1

Это не ответ, а больше предложений, которые вы можете попробовать. Трудно комментировать проблемы производительности без полного mcve, что позволит легко воспроизводить проблемы локально в минимальном приложении.


Некоторые вещи, которые вы могли бы попробовать это:

  1. Use background loading for your images.
  2. Cache loaded images in a LRU cache.
  3. Используйте виртуализованный элемент управления, например ControlsFX GridView.

Смотрите также некоторые из предложений по оптимизации производительности в родственном ответа (некоторые из которых не могут быть применимы к вашей ситуации):


Кроме того, ваш проблема может быть в коде, который вы не видите. Ваша процедура проходит экземпляр альбома, который включает данные альбома, включая данные изображения в двоичной форме. Если вы загружаете данные альбома и изображения из базы данных динамически, этот процесс может замедлить или заморозить ваше приложение, в зависимости от того, как вы это делаете.

 Смежные вопросы

  • Нет связанных вопросов^_^