首页 文章

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

提问于
浏览
0

我有桌面视图的升问题 . 当我从可观察列表中删除元素时,不会删除此元素上的行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 回答

  • 1

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

    从表的项目列表中删除项目时,以前用于显示项目的单元格(可能)将被重新用作空单元格;即将调用其 updateItem(null, true) 方法 . 对于 item == null && empty == true 的情况,您当前的实现不会执行任何操作,因此要更改单元格's appearance won' .

    你需要

    @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);
            }
        }
    }
    

相关问题