JavaFX TableView 删除问题

标签 javafx tableview

我在 JavaFX 中从 TableView 中删除数据时遇到一些问题。 TabeView 从静态 ObservableList 接收数据。

问题:TableView 一次显示 6 行。例如,当我的 ObservableList 中有 6 个数据对象并且我删除其中 1 个时,TableView 似乎有一些更新问题:

Error

正如您所看到的,红色突出显示的行似乎是中仍然存在的值的副本 我的可观察列表。您无法选择此行,因为当然不存在现有的 ObservableList 中的值。删除更多值后,此行为继续出现:

enter link description here

所有突出显示的“行”都是不可选择的,因为我的 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/

相关文章:

swift - 专门更改填充有数组元素的 TableView 中的一个单元格

swift - 基于 Swift 中的列表选择在 ViewController 之间传递值

ios - 表格 View 上显示姓名、名字和日期

java - 图层是在 JavaFX Canvas 上合成图形的唯一方法吗?

JavaFX:AnimationTimer与MenuBar的交互

带有 ChangeListener 的 JavaFX TableView 用于多选

xcode - 如何填充 TableView 而不是 TableView Controller ?

JavaFX 使用 Ant 部署额外文件

java - JavaFX 中的渐变

java - `AutoFillTextBox type is not resolvable` 为什么?