【问题标题】:JavaFX TableView delete issueJavaFX TableView 删除问题
【发布时间】:2014-10-21 08:35:05
【问题描述】:

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

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

Error

如您所见,红色突出显示的行似乎是仍然存在的值的副本 我的 ObservableList。您不能选择此行,因为当然不存在 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);
}

我已经用谷歌搜索过这个问题,但似乎没有其他人有这个问题。 请帮我! =)

【问题讨论】:

    标签: javafx tableview


    【解决方案1】:

    以前有人问过这个,但我现在找不到。问题是您的 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;
    

    对于其他细胞工厂也是如此。

    【讨论】:

    • 谢谢老兄。现在很明显:D。顺便说一句,它可能是“else { imgView.setImage(image); setGraphic(imageView); }”并在 columnName 列中执行相同操作。 =)
    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 2019-02-26
    • 2014-04-29
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    相关资源
    最近更新 更多