JavaFX TableView删除问题

时间:2014-08-27 16:36:40

标签: javafx tableview

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

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

Error

如您所见,红色突出显示的行似乎是一个仍然存在的值的副本 我的ObservableList。您无法选择此行,因为当然没有存在 ObservableList中的值。删除更多值后,此行为会一直显示:

enter link description here

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

我已经搜索了这个问题,但似乎没有其他人拥有它。 请帮我! =)

1 个答案:

答案 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;

和其他细胞工厂类似。