我在 JavaFX 中从 TableView 中删除数据时遇到一些问题。 TabeView 从静态 ObservableList 接收数据。
问题:TableView 一次显示 6 行。例如,当我的 ObservableList 中有 6 个数据对象并且我删除其中 1 个时,TableView 似乎有一些更新问题:
正如您所看到的,红色突出显示的行似乎是中仍然存在的值的副本 我的可观察列表。您无法选择此行,因为当然不存在现有的 ObservableList 中的值。删除更多值后,此行为继续出现:
所有突出显示的“行”都是不可选择的,因为我的 ObservableList 中没有相应的值。仅在删除 TableView 中的最后一个值/行后,它才会刷新并变为空。
我的 ObservableList 是静态的
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);
}
我已经用谷歌搜索过这个问题,但似乎没有其他人遇到过这个问题。 请帮我! =)
最佳答案
这个问题以前有人问过,但现在找不到了。问题是您的 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;
其他细胞工厂也类似。
关于JavaFX TableView 删除问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25532568/