У меня есть 5 изображений в виде файлов, которые я хочу использовать для нескольких рядов моей Vaadin-Grid.Я заметил, что мне приходится загружать картинки снова и снова для каждого потока, чтобы это работало.Следующий способ не сработал для меня, и я не могу объяснить это мне.
(Image
- это com.vaadin.flow.component.html.Image;
из Vaadin 14)
Я загружаю изображение следующим образом.Я удалил обработку ошибок, чтобы было легче читать.
public static Image loadImage(...) {
File file = new File(filepath);
var bufferedImage = ImageIO.read(file);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ImageIO.write(bufferedImage, getFileExtension(filepath), bout);
var bytes = bout.toByteArray();
StreamResource resource = new StreamResource(defaultNameImage, () -> new ByteArrayInputStream(bytes));
bout.close();
return new Image(resource, defaultNameImage);
}
Каждая строка сетки создается следующим образом (упрощенно):
private Entry createEntry(...) {
var image = UtilFile.loadImage(PATH_TO_IMAGE, DEFAULT_NAME);
return new Entry(image);
}
Реальная проблема возникает, если яхотите снова получить доступ к изображению, чтобы отобразить его в пользовательском интерфейсе.
grid.addColumn(new ComponentRenderer<Image, Entry>(entry -> {
return entry.getImage(); // Here is the trouble
}
})).setHeader("Image");
Только одно изображение отображается вместо 1 для каждой строки.Это потому, что поток можно использовать только один раз?Я бы предположил, что новый экземпляр Image будет иметь изображение.Я немного запутался, извините.
Теперь конкретные вопросы:
Почему мой путь не работает?Используется ли поток только один раз, а другие экземпляры Image не получают загруженное изображение?
Можно ли избежать такого большого количества потоков?Я хотел бы просто сохранить изображение в памяти и использовать его повторно.
Заранее спасибо!