I'm really having trouble understanding CellFactory and CellValueFactory in JavaFX TableColumn. I have to copy and modify most of the code from other people's questions. I'm trying to add a column that displays one image for every item that has a certain boolean value set to negative, and one image for the positive ones. The code is here (copied and modified):
TableColumn <Track,Track> coverCol = new TableColumn<>("Artwork");
coverCol.setCellFactory(new Callback<TableColumn<Track, Track>, TableCell<Track, Track>>() {
@Override
public TableCell<Track, Track> call(TableColumn<Track, Track> coverCol) {
return new TableCell<Track, Track>(){
final ImageView hasArtworkView = new ImageView();
@Override public void updateItem(final Track artworkTrack,boolean empty){
super.updateItem(artworkTrack,empty);
if(artworkTrack != null){
if(artworkTrack.hasCover()){
hasArtworkView.setImage(hasArtworkIcon);
}else{
hasArtworkView.setImage(noArtworkIcon);
}
setGraphic(hasArtworkView);
}else {
setGraphic(null);
}
}
};
}
});
The updateItem class can never look at an object, and it always defaults to null. Is there something I'm missing or should I implement this differently?
Track class:
public class Track {
public String fileName;
public String trackName;
public String artistName;
public String albumName;
public String filePath;
public SimpleBooleanProperty selected;
public BufferedImage cover;
Tag tag;
public Track(File f){
selected = new SimpleBooleanProperty(true);
AudioFile af = null;
try {
af = AudioFileIO.read(f);
} catch (CannotReadException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TagException e) {
e.printStackTrace();
} catch (ReadOnlyFileException e) {
e.printStackTrace();
} catch (InvalidAudioFrameException e) {
e.printStackTrace();
}
tag = af.getTag();
fileName = f.getName();
filePath = f.getPath();
trackName = tag.getFirst(FieldKey.TITLE);
artistName = tag.getFirst(FieldKey.ARTIST);
albumName = tag.getFirst(FieldKey.ALBUM);
Artwork artwork = tag.getFirstArtwork();
if(hasCover()){
try {
cover = Images.getImage(artwork);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public String getTrackName(){
return trackName;
}
public String getArtistName(){
return artistName;
}
public String getAlbumName(){
return albumName;
}
public boolean isSelected() {return selected.getValue();}
public ObservableValue selectedProperty(){return selected;}
public BufferedImage getCover (){return cover;}
public String getFileName() {
return fileName;
}
public String getFilePath(){return filePath;}
public void setTrackName(String s){trackName = s;}
public void setArtistName(String s){artistName = s;}
public void setAlbumName (String s){albumName = s;}
public void setSelected (boolean b){selected.set(b);}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public boolean hasCover(){
return tag.hasField(FieldKey.COVER_ART);
}
public boolean hasTrackName(){return tag.hasField(FieldKey.TITLE);}
public boolean hasArtistName(){return tag.hasField(FieldKey.ARTIST);}
}