在tableColumn中放置一个图像 - 从不使用updateItem

时间:2016-09-10 21:42:40

标签: java user-interface javafx javafx-8

我试图将图像添加到tableView并经历了几个问题和答案,但它仍然无法正常工作。

正确加载tableView中的其他字段。

Intelij告诉我updateItem从未使用过,这可能就是为什么它不起作用,但我不知道如何调试它......

这是我到目前为止所得到的

    @FXML private TableColumn<PlayerManager, Image> tableColumnType;
    @FXML private void initialize(){

    tableColumnType.setCellFactory(param -> {
        //Set up the ImageView
        final ImageView imageview = new ImageView();
        imageview.setFitHeight(10);
        imageview.setFitWidth(10);
        ///imageview.setImage(imageComputer); //uncommenting this places the image on all cells, even empty ones
        //Set up the Table
        TableCell<PlayerManager, Image> cell = new TableCell<PlayerManager, Image>() {
            public void updateItem(PlayerManager item, boolean empty) {
                if (item != null) {  // choice of image is based on values from item, but it doesn't matter now
                    imageview.setImage(imageComputer);
                }
            }
        };

        // Attach the imageview to the cell
        cell.setGraphic(imageview);
        return cell;
    });
    }

我遇到的问题是:

How to add an Image into a JavaFx TableView column

Display image in table

Inserting images into TableView rows - JavaFX

2 个答案:

答案 0 :(得分:2)

updateItem方法的签名是错误的:它应该是

public void updateItem(Image item, boolean empty) { /* ... */ }

如果编译器拒绝@Override注释,那么您知道您没有定义正确的方法。所以你应该使用@Override,如果你遇到编译错误,那就是一个不对的信号。

所以你应该能够做到

@FXML private TableColumn<PlayerManager, Image> tableColumnType;
@FXML private void initialize(){

tableColumnType.setCellFactory(param -> {
        //Set up the ImageView
        final ImageView imageview = new ImageView();
        imageview.setFitHeight(10);
        imageview.setFitWidth(10);
        ///imageview.setImage(imageComputer); //uncommenting this places the image on all cells, even empty ones
        //Set up the Table
        TableCell<PlayerManager, Image> cell = new TableCell<PlayerManager, Image>() {
            @Override
            public void updateItem(Image item, boolean empty) {
                if (item != null) {  // choice of image is based on values from item, but it doesn't matter now
                    imageview.setImage(imageComputer);
                }
            }
        };

        // Attach the imageview to the cell
        cell.setGraphic(imageview);
        return cell;
    });
}

如果您的表格单元格需要访问实际的PlayerManager对象,那么您需要将表格列设为TableColumn<PlayerManager, PlayerManager>并相应地更新cellValueFactory(您尚未显示) 。

最后,请注意您的updateItem(...)方法需要处理所有情况,包括项为空的空单元格。

所以你可能需要像

这样的东西
@FXML private TableColumn<PlayerManager, PlayerManager> tableColumnType;
@FXML private void initialize(){

    tableColumnType.setCellValueFactory(cellData -> new SimpleObjectProperty<PlayerManager>(cellData.getValue());

    tableColumnType.setCellFactory(param -> {
        //Set up the ImageView
        final ImageView imageview = new ImageView();
        imageview.setFitHeight(10);
        imageview.setFitWidth(10);
        ///imageview.setImage(imageComputer); //uncommenting this places the image on all cells, even empty ones
        //Set up the Table
        TableCell<PlayerManager, PlayerManager> cell = new TableCell<PlayerManager, PlayerManager>() {
            @Override
            public void updateItem(PlayerManager item, boolean empty) {
                if (item != null) {  // choice of image is based on values from item, but it doesn't matter now
                    imageview.setImage(imageComputer);
                } else {
                    imageView.setImage(null);
                }
            }
        };

        // Attach the imageview to the cell
        cell.setGraphic(imageview);
        return cell;
    });
}

答案 1 :(得分:1)

updateItem()方法的签名是错误的。 尝试使用:

@Override
protected void updateItem(Image item, boolean empty){
    //your code
}

编辑: 我认为您也可以通过为TableColumn设置CellValueFactory来解决您的问题:

tableColumnType.setCellValueFactory(
                new Callback<CellDataFeatures<PlayerManager, Image>, ObservableValue<Image>(){
                @Override
                public ObservableValue<Image> call(
                        CellDataFeatures<PlayerManager, Image> param) {
                    return param.getValue().exampleMethod; /* Method of your PlayerManager which returns an Image as ObservableValue. To do so you could wrap it in an `ObjectProperty<Image>`*/
                }

            }
    );