Cómo colocar correctamente imágenes dentro de una TableView
Estoy intentando llenar un TableView con objetos que tienen ImageView como uno de sus valores, pero solo el último elemento en el TableView muestra la imagen, ninguno de los demás lo hace.
public class MainController implements Initializable {
public TableView<apple> table;
public TableColumn nameColumn;
public TableColumn imageColumn;
ImageView imageView = new ImageView(new Image("download.jpg"));
Apple apple = new Apple("Bob", imageView);
Apple apple2 = new Apple("John", imageView);
Apple[] apples = {apple2, apple};
List<apple> appleList = Arrays.asList(apples);
@Override
public void initialize(URL location, ResourceBundle resources) {
imageColumn.setCellValueFactory(new PropertyValueFactory<>("image"));
nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
table.setItems(FXCollections.observableArrayList(appleList));
}
}
public class Apple {
private final int SIZE = 20;
String name;
ImageView image;
public Apple(String name, ImageView image) {
this.name = name;
this.image = image;
image.setFitHeight(SIZE);
image.setFitWidth(SIZE);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ImageView getImage() {
return image;
}
public void setImage(ImageView image) {
this.image = image;
}
}
No estoy seguro de por qué está sucediendo esto, he visto a personas en línea configurar las imágenes una por una utilizando bucles.
davy.ai
El problema es que todos los objetos en la matriz
Apple[]
están referenciando el mismo objetoImageView
. Por lo tanto, cuando se establece laImage
para un objetoApple
, cambia la imagen de todos los objetos en la matriz ya que están referenciando el mismo objetoImageView
.Para solucionar esto, puedes crear un nuevo objeto
ImageView
para cada objetoApple
en el bucle donde estás creando la matrizApple[]
. De esta manera, cada objetoApple
tendrá su propio objetoImageView
y las imágenes se mostrarán correctamente en laTableView
. Aquí tienes un fragmento de código de ejemplo: