JavaFX CellFactory updateItem始终为null

时间:2016-02-19 19:13:06

标签: javafx tableview

我在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);
                        }
                    }
                };

            }
        });

2 个答案:

答案 0 :(得分:0)

你可以这样做:

coverCol.setCellValueFactory(data -> new ReadOnlyObjectWrapper<Track>(data.getValue()));

这将允许您将数据放入列中,然后您的单元工厂将工作。

答案 1 :(得分:0)

传递给updateItem的项目始终为空,因为您没有定义cellValueFactory。单元格值工厂确定单元格显示的数据。

由于您的专栏真的对在行所代表的项目上调用hasCover()的结果感兴趣,因此将其设为TableColumn<Track, Boolean>会更有意义。 (单元格中显示的数据为truefalse,即它是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);
        }
    }
});