我在JavaFX中从TableView中删除数据时遇到了一些问题。 TabeView从静态ObservableList接收数据。
问题:TableView一次显示6行。当我的ObservableList中有6个数据对象并删除其中的1个时,TableView似乎有一些更新问题:
如您所见,红色突出显示的行似乎是一个仍然存在的值的副本 我的ObservableList。您无法选择此行,因为当然没有存在 ObservableList中的值。删除更多值后,此行为会一直显示:
所有突出显示“行”都不可选,因为我的ObservableList中没有相应的值。只有在删除TableView中的最后一个值/行后,它才会刷新并变为空。
My ObservableList ist static
public static ObservableList<ImageData> datas_all;
删除非常简单
@FXML
private TableView<ImageData> imageTable;
...
@FXML
private void handleDeleteImage()
{
ImageData img_data = imageTable.getSelectionModel().getSelectedItem();
Main.datas_all.remove(img_data);
//if(Main.datas_flickr.contains(img_data))
// Main.datas_flickr.remove(img_data);
//Main.db_adapter.deleteImage(new Integer[]{img_data.getKey()});
//File del_file = new File(img_data.getPath());
//del_file.delete();
}
TableView由
定义的两行组成 @FXML
private TableColumn<ImageData,Image> columnImage;
@FXML
private TableColumn<ImageData,String> columnName;
...
public void redefineTableView()
{
columnImage.setCellFactory(new Callback<TableColumn<ImageData, Image>, TableCell<ImageData, Image>>()
{
@Override
public TableCell<ImageData, Image> call(TableColumn<ImageData, Image> param)
{
final ImageView imgView = new ImageView();
imgView.setFitHeight(100);
imgView.setFitWidth(100);
TableCell<ImageData, Image> cell = new TableCell<ImageData, Image>()
{
public void updateItem(Image image, boolean empty)
{
if(image != null)
imgView.setImage(image);
}
};
cell.setGraphic(imgView);
return cell;
}
});
columnName.setCellFactory(new Callback<TableColumn<ImageData, String>, TableCell<ImageData, String>>()
{
@Override
public TableCell<ImageData, String> call(TableColumn<ImageData, String> param)
{
TableCell<ImageData, String> cell = new TableCell<ImageData, String>()
{
private Text text;
public void updateItem(String string, boolean empty)
{
super.updateItem(string, empty);
if (!isEmpty())
{
text = new Text(string);
text.setWrappingWidth(170);
setGraphic(text);
}
}
};
return cell;
}
});
columnName.setCellValueFactory(new PropertyValueFactory<ImageData, String>("name"));
columnImage.setCellValueFactory(new PropertyValueFactory<ImageData, Image>("image"));
imageTable.setItems(Main.datas_all);
}
我已经搜索了这个问题,但似乎没有其他人拥有它。 请帮我! =)
答案 0 :(得分:4)
以前曾经问过,但我现在找不到它。问题是您的updateItem(...)
方法无法正确处理图像为空(或单元格为空)的情况。从表中删除项目时就是这种情况。你需要:
TableCell<ImageData, Image> cell = new TableCell<ImageData, Image>()
{
public void updateItem(Image image, boolean empty)
{
if(image == null) {
setGraphic(null);
} else {
imgView.setImage(image);
setGraphic(imgView);
}
}
};
return cell;
和其他细胞工厂类似。