我试图将图像添加到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;
});
}
我遇到的问题是:
答案 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>`*/
}
}
);