Причина, по которой вы не видите изображение, заключается в том, что, хотя вы правильно предоставляете свои TableView
байты изображения, вы не указываете, как их визуализировать. Вам нужен пользовательский TableCell
, который отображает байтовый массив в ImageView
. Поэтому я бы сделал следующее:
Сначала добавьте свойство id в ваш TableColumn
в вашем файле f xml:
<TableColumn fx:id="imageColumn" text="Picture" style="-fx-backround-color:#33d9b2">
<cellValueFactory>
<PropertyValueFactory property="image"/>
</cellValueFactory>
</TableColumn>
Затем сделайте ссылку на него внутри вашего контроллера и добавьте CellFactory к нему:
@FXML
public TableView<Avatar> produits;
@FXML
public TableColumn<Avatar, byte[]> imageColumn;
@FXML
public void initialize() {
...
imageColumn.setCellFactory(param -> new TableCell<Avatar, byte[]>() {
private ImageView imageView = new ImageView();
@Override
protected void updateItem(byte[] item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
setGraphic(null);
} else {
imageView.setImage(getImageFromBytes(item));
setGraphic(imageView);
}
this.setItem(item);
}
});
...
}
CellFactory
создает ячейку таблицы для каждого элемента Аватара, а метод updateItem()
этой ячейки преобразует байты в Image
который в свою очередь отображается в ImageView
(если ячейка не пуста). Вот способ преобразования массива байтов в JavaFX Image :
private Image getImageFromBytes(byte[] imgBytes) {
try {
ByteArrayInputStream inputStream = new ByteArrayInputStream(imgBytes);
BufferedImage bufferedImage = ImageIO.read(inputStream);
return SwingFXUtils.toFXImage(bufferedImage, null);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
Важное примечание: Я бы не стал вызывать метод getImageFromBytes()
изнутри updateItem()
, особенно для TableView с большим количеством записей. Я просто сделал это для простоты. Возможно, вы захотите заранее преобразовать изображения и, возможно, сохранить их на карте или что-то в этом роде.
Редактировать: Изменен метод updateItem()
, чтобы каждый раз не создавать новый ImageView
называется.