我在JavaFX TableColumn中理解CellFactory和CellValueFactory时遇到了麻烦。我必须从其他人的问题中复制和修改大部分代码。我试图添加一个列,为每个具有某个布尔值设置为负的项目显示一个图像,并为正面的一个图像添加一个图像。代码在这里(复制和修改):
>>> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
updateItem类永远不能查看对象,它始终默认为null。我有什么遗漏或者我应该以不同的方式实现这一点吗?
跟踪课程:
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);
}
}
};
}
});
答案 0 :(得分:0)
你可以这样做:
coverCol.setCellValueFactory(data -> new ReadOnlyObjectWrapper<Track>(data.getValue()));
这将允许您将数据放入列中,然后您的单元工厂将工作。
答案 1 :(得分:0)
传递给updateItem
的项目始终为空,因为您没有定义cellValueFactory
。单元格值工厂确定单元格显示的数据。
由于您的专栏真的对在行所代表的项目上调用hasCover()
的结果感兴趣,因此将其设为TableColumn<Track, Boolean>
会更有意义。 (单元格中显示的数据为true
或false
,即它是Boolean
。)
所以我要定义:
TableColumn<Track, Boolean> coverCol = new TableColumn<>("Artwork");
coverCol.setCellValueFactory(cellData -> new SimpleBooleanProperty(cellData.getValue().hasCover()));
coverCol.setCellFactory(tc -> new TableCell<Track, Boolean>() {
final ImageView hasArtworkView = new ImageView();
@Override public void updateItem(Boolean hasCover ,boolean empty){
super.updateItem(hasCover, empty);
if(hasCover != null){
if(hasCover){
hasArtworkView.setImage(hasArtworkIcon);
}else{
hasArtworkView.setImage(noArtworkIcon);
}
setGraphic(hasArtworkView);
}else {
setGraphic(null);
}
}
});