表视图中的JavaFX行未删除ater remove元素

时间:2017-04-30 12:09:04

标签: javafx

表格视图有一升问题。当我从可观察列表中删除元素时,不会删除此元素上的行correspandont。

我有一个关系列表(person1,type,person2 => children) 当我添加一个新子项时,创建了reliation(null,neutral,null => child)。

在添加了一些人之后,我改变了他们之间的关系,因此,当我指出兄弟姐妹时,会删除一些实际情况。但在表格视图中仍然可见。它不是可选择的,但是当我点击它时,它就是独特的。列表中的最后一个关系。

当我添加新Person时,该行被覆盖。

this.relationSimLeftColumn.setCellValueFactory(cellData -> cellData.getValue().simLeftProperty());
this.relationSimRightColumn.setCellValueFactory(cellData -> cellData.getValue().simRightProperty());
this.relationTypeColumn.setCellValueFactory(cellData -> cellData.getValue().typeProperty());

和细胞工厂:

 private Callback<TableColumn<GTX_Relation, GTX_Member>,
            TableCell<GTX_Relation, GTX_Member>> setMemberCellFactory(String parameter) {
        Callback<TableColumn<GTX_Relation, GTX_Member>, TableCell<GTX_Relation, GTX_Member>> callback =
                new Callback<TableColumn<GTX_Relation, GTX_Member>, TableCell<GTX_Relation, GTX_Member>>() {
                    @Override
                    public TableCell<GTX_Relation, GTX_Member> call(TableColumn<GTX_Relation, GTX_Member> param) {
                        TableCell<GTX_Relation, GTX_Member> cell = new TableCell<GTX_Relation, GTX_Member>() {

                            @Override
                            protected void updateItem(GTX_Member item, boolean empty) {
                                super.updateItem(item, empty);
                                ImageView imageview = new ImageView();
                                if (item != null) {
                                    imageview.setFitHeight(TABLE_IMAGE_MEMBER_HEIGHT);
                                    imageview.setFitWidth(TABLE_IMAGE_MEMBER_WIDTH);
                                    imageview.setImage(new Image(item.getPhoto()));
                                    setGraphic(imageview);
                                } else {
                                    if (!empty) {
                                        imageview.setFitHeight(TABLE_IMAGE_MEMBER_HEIGHT);
                                        imageview.setFitWidth(TABLE_IMAGE_MEMBER_WIDTH);
                                        String path = parameter.equals("LEFT") == true ?
                                                ImageFiles.NO_NAME_FEMALE.toString() : ImageFiles.NO_NAME_MALE.toString();
                                        imageview.setImage(new Image(path));
                                        setGraphic(imageview);
                                    }
                                }
                            }

                        };
                        return cell;
                    }
                };

        return callback;
    }

1 个答案:

答案 0 :(得分:1)

您的单元工厂需要处理单元格为空的情况。

当您从表格的项目列表中删除某个项目时,之前用于显示项目的单元格(可能)将被重新用作空单元格;即将调用其updateItem(null, true)方法。您当前的实施对于item == null && empty == true的情况不做任何事情,因此单元格的外观不会被更改。

你需要

@Override
protected void updateItem(GTX_Member item, boolean empty) {
    super.updateItem(item, empty);
    ImageView imageview = new ImageView();
    if (item != null) {
        imageview.setFitHeight(TABLE_IMAGE_MEMBER_HEIGHT);
        imageview.setFitWidth(TABLE_IMAGE_MEMBER_WIDTH);
        imageview.setImage(new Image(item.getPhoto()));
        setGraphic(imageview);
    } else {

        if (empty) {

            setGraphic(null);

        } else {

            imageview.setFitHeight(TABLE_IMAGE_MEMBER_HEIGHT);
            imageview.setFitWidth(TABLE_IMAGE_MEMBER_WIDTH);
            String path = parameter.equals("LEFT") == true ?
                    ImageFiles.NO_NAME_FEMALE.toString() : ImageFiles.NO_NAME_MALE.toString();
            imageview.setImage(new Image(path));
            setGraphic(imageview);
        }
    }
}