Javafx动态添加行重复数据

Nes*_*ose 1 javafx tableview

我在 Javafx 中有一个 Tableview,其中我尝试在用户按下按钮时动态添加一行。问题是,执行此操作时,表中以前的数据会重复。我必须说,如果我打印表中项目的大小,它会返回正确的大小,没有重复项,并且我无法选择重复的项目,也无法滚动查看它们。\n这是我的代码:\ ndetail.fxml

\n
<TableView fx:id="tblPersonalExterno" prefHeight="200.0" prefWidth="200.0" VBox.vgrow="ALWAYS">\n                                            <columns>\n                                                <TableColumn prefWidth="781.0000244379044">\n                                                    <graphic>\n                                                        <Label text="Externo" />\n                                                    </graphic>\n                                                    <columns>\n                                                        <TableColumn fx:id="tblcNombreExterno" prefWidth="270" text="Nombre"/>\n                                                        <TableColumn fx:id="tblcEmpresaExterno" prefWidth="270" text="Empresa" />\n                                                        <TableColumn fx:id="tblcInfPRLExterno" minWidth="0.0" prefWidth="59.0">\n                                                            <graphic>\n                                                                <Label text="Inf. PRL">\n                                                                    <tooltip>\n                                                                        <Tooltip text="Informado PRL" />\n                                                                    </tooltip>\n                                                                </Label>\n                                                            </graphic>\n                                                        </TableColumn>\n                                                        <TableColumn fx:id="tblcAprobadoPRLExterno" minWidth="0.0" prefWidth="73.00003051757812">\n                                                            <graphic>\n                                                                <Label text="Apr. Cl. PRL">\n                                                                    <tooltip>\n                                                                        <Tooltip text="Aprobado cliente PRL" />\n                                                                    </tooltip>\n                                                                </Label>\n                                                            </graphic>\n                                                        </TableColumn>\n                                                        <TableColumn fx:id="tblcFechaAprPRLExterno" prefWidth="100.0">\n                                                            <graphic>\n                                                                <Label text="Fecha apr.">\n                                                                    <tooltip>\n                                                                        <Tooltip text="Fecha de aprobaci\xc3\xb3n" />\n                                                                    </tooltip>\n                                                                </Label>\n                                                            </graphic>\n                                                        </TableColumn>\n                                                        <TableColumn prefWidth="60.0" text="Validez PRL">\n                                                            <columns>\n                                                                <TableColumn fx:id="tblcFechaDesdePRLExterno"  prefWidth="100.0" text="Desde" />\n                                                                <TableColumn fx:id="tblcFechaHastaPRLExterno" prefWidth="100.0" text="Hasta" />\n                                                            </columns>\n                                                        </TableColumn>\n                                                    </columns>\n                                                </TableColumn>\n                                            </columns>\n                                        </TableView>\n<ToolBar prefHeight="40.0" prefWidth="200.0">\n                                            <items>\n                                                <Button fx:id="btnA\xc3\xb1adirExterno" mnemonicParsing="false" onAction="#addExterno">\n                                                    <graphic>\n                                                        <FontIcon iconLiteral="mdi-account-plus"\n                                                            iconSize="16" />\n                                                    </graphic>\n                                                    <tooltip>\n                                                        <Tooltip text="A\xc3\xb1adir Personal Externo" />\n                                                    </tooltip>\n                                                </Button>\n                                                <Button fx:id="btnEliminarExterno" mnemonicParsing="false">\n                                                    <graphic>\n                                                        <FontIcon iconLiteral="mdi-delete-forever"\n                                                            iconSize="16" />\n                                                    </graphic>\n                                                    <tooltip>\n                                                        <Tooltip text="Eliminar Personal Externo" />\n                                                    </tooltip>\n                                                </Button>\n                                            </items>\n                                        </ToolBar>\n
Run Code Online (Sandbox Code Playgroud)\n

详情控制器.java

\n
public class DetailsController {\n    private ObservableList<Responsable> listaPersonalExterno = FXCollections.observableArrayList();\n    @FXML\n    private TableView<Responsable> tblPersonalExterno;\n    @FXML\n    private TableColumn<Responsable, String> tblcNombreExterno;\n    @FXML\n    private TableColumn<Responsable, String> tblcEmpresaExterno;\n    @FXML\n    private TableColumn<Responsable, Boolean> tblcInfPRLExterno;\n    @FXML\n    private TableColumn<Responsable, Boolean> tblcAprobadoPRLExterno;\n    @FXML\n    private TableColumn<Responsable, LocalDate> tblcFechaAprPRLExterno;\n    @FXML\n    private TableColumn<Responsable, LocalDate> tblcFechaDesdePRLExterno;\n    @FXML\n    private TableColumn<Responsable, LocalDate> tblcFechaHastaPRLExterno;\n    \n    public DetailsController() {\n        cargarPersonalExterno();\n    }\n    public ObservableList<Responsable> listaPersonalExterno(){\n        return listaPersonalExterno;\n    }\n    \n    @FXML\n    public void initialize() {\n        doBindTablaPersonalExterno();\n    }\n    \n    private void doBindTablaPersonalExterno() {\n        tblcNombreExterno.setCellValueFactory(new PropertyValueFactory<Responsable, String>("nombre"));\n        tblcNombreExterno.setCellFactory(col -> {\n            TableCell<Responsable, String> cell = new TableCell<Responsable, String>(){\n                @Override\n                public void updateItem(String item, boolean empty) {\n                    super.updateItem(item, empty);\n                    if(empty) {\n                        setText("");\n                    }else {\n                        TextField tf = new TextField();\n                        tf.setText(item);\n                        setGraphic(tf);\n                    }\n                }\n            };\n            return cell;\n        });\n        tblcEmpresaExterno.setCellValueFactory(new PropertyValueFactory<Responsable, String>("empresa"));\n        tblcEmpresaExterno.setCellFactory(col -> {\n            TableCell<Responsable, String> cell = new TableCell<Responsable, String>(){\n                @Override\n                public void updateItem(String item, boolean empty) {\n                    super.updateItem(item, empty);\n                    if(empty) {\n                        setText("");\n                    }else {\n                        TextField tf = new TextField();\n                        tf.setText(item);\n                        setGraphic(tf);\n                    }\n                }\n            };\n            return cell;\n        });\n        tblcInfPRLExterno.setCellValueFactory(cellData -> new SimpleBooleanProperty(cellData.getValue().getPrl().isInformado()));\n        tblcInfPRLExterno.setCellFactory(col -> {\n            TableCell<Responsable, Boolean> cell = new TableCell<Responsable, Boolean>(){\n                @Override\n                public void updateItem(Boolean item, boolean empty) {\n                    super.updateItem(item, empty);\n                    if(empty) {\n                        setText("");\n                    }else {\n                        CheckBox chk = new CheckBox();\n                        setStyle("-fx-alignment: CENTER;");\n                        if(item != null) {\n                            chk.setSelected(item);\n                        }\n                        setGraphic(chk);\n                    }\n                }\n            };\n            return cell;\n        });\n        tblcAprobadoPRLExterno.setCellValueFactory(cellData -> new SimpleBooleanProperty(cellData.getValue().getPrl().isAprobado()));\n        tblcAprobadoPRLExterno.setCellFactory(col -> {\n            TableCell<Responsable, Boolean> cell = new TableCell<Responsable, Boolean>(){\n                @Override\n                public void updateItem(Boolean item, boolean empty) {\n                    super.updateItem(item, empty);\n                    if(empty) {\n                        setText("");\n                    }else {\n                        CheckBox chk = new CheckBox();\n                        setStyle("-fx-alignment: CENTER;");\n                        if(item != null) {\n                            chk.setSelected(item);\n                        }\n                        setGraphic(chk);\n                    }\n                }\n            };\n            return cell;\n        });\n        tblcFechaAprPRLExterno.setCellValueFactory(cellData -> new SimpleObjectProperty<LocalDate>(cellData.getValue().getPrl().getFechaAprobacion()));\n        tblcFechaAprPRLExterno.setCellFactory(col -> {\n            TableCell<Responsable, LocalDate> cell = new TableCell<Responsable, LocalDate>(){\n                @Override\n                public void updateItem(LocalDate item, boolean empty) {\n                    super.updateItem(item, empty);\n                    if(empty) {\n                        setText("");\n                    }else {\n                        DatePicker dp = new DatePicker();\n                        setStyle("-fx-alignment: CENTER;");\n                        dp.setValue(item);\n                        setGraphic(dp);\n                    }\n                }\n            };\n            return cell;\n        });\n        \n        tblcFechaDesdePRLExterno.setCellValueFactory(cellData -> new SimpleObjectProperty<LocalDate>(cellData.getValue().getPrl().getValidez().getInicio()));\n        tblcFechaDesdePRLExterno.setCellFactory(col -> {\n            TableCell<Responsable, LocalDate> cell = new TableCell<Responsable, LocalDate>(){\n                @Override\n                public void updateItem(LocalDate item, boolean empty) {\n                    super.updateItem(item, empty);\n                    if(empty) {\n                        setText("");\n                    }else {\n                        DatePicker dp = new DatePicker();\n                        setStyle("-fx-alignment: CENTER;");\n                        dp.setValue(item);\n                        setGraphic(dp);\n                    }\n                }\n            };\n            return cell;\n        });\n        \n        tblcFechaHastaPRLExterno.setCellValueFactory(cellData -> new SimpleObjectProperty<LocalDate>(cellData.getValue().getPrl().getValidez().getInicio()));\n        tblcFechaHastaPRLExterno.setCellFactory(col -> {\n            TableCell<Responsable, LocalDate> cell = new TableCell<Responsable, LocalDate>(){\n                @Override\n                public void updateItem(LocalDate item, boolean empty) {\n                    super.updateItem(item, empty);\n                    if(empty) {\n                        setText("");\n                    }else {\n                        DatePicker dp = new DatePicker();\n                        setStyle("-fx-alignment: CENTER;");\n                        dp.setValue(item);\n                        setGraphic(dp);\n                    }\n                }\n            };\n            return cell;\n        });\n    }\n        \n    /**\n     * Carga el personal externo\n     */\n    private void cargarPersonalExterno() {\n        List<Responsable> lista = new ArrayList<Responsable>();\n        Responsable r1 = new Responsable();\n        r1.setNombre("NEUS");\n        Responsable r2 = new Responsable();\n        r2.setNombre("PEPE");\n        lista.add(r1);\n        lista.add(r2);\n        listaPersonalExterno.addAll(lista);\n    }\n        \n    @FXML\n    public void addExterno() {\n        Responsable r = new Responsable();\n        listaPersonalExterno.add(r);\n    }\n    \n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是该行为的图像。空白行下的重复行似乎不存在,因为我无法选择它们、无法滚动并且无法通过代码访问它们。\n截屏

\n

Sai*_*dem 5

您的代码的问题是,当您的项目为空或为空时,您仅将文本设置为空,而不将图形设置为空。因此,当重复使用行/单元格时,图形部分仍将保留在单元格中。

当所有单元工厂中的项目为空时,重置文本和图形。而且在 updateItem 方法中创建新节点也是一个坏主意。创建每个单元格实例的 DatePicker 并将其设置为 updateItem 中的图形。就像是 :

tblcFechaDesdePRLExterno.setCellFactory(col -> {
            TableCell<Responsable, LocalDate> cell = new TableCell<Responsable, LocalDate>(){
               private DatePicker dp = new DatePicker();
               @Override
                public void updateItem(LocalDate item, boolean empty) {
                    super.updateItem(item, empty);
                    if(empty) {
                        setText(null);
                        setGraphic(null); // THIS IS MISSING IN YOUR CODE
                    }else {
                        setStyle("-fx-alignment: CENTER;");
                        dp.setValue(item);
                        setGraphic(dp);
                    }
                }
            };
            return cell;
        });
Run Code Online (Sandbox Code Playgroud)