我在 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>\nRun Code Online (Sandbox Code Playgroud)\n详情控制器.java
\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n\n
您的代码的问题是,当您的项目为空或为空时,您仅将文本设置为空,而不将图形设置为空。因此,当重复使用行/单元格时,图形部分仍将保留在单元格中。
当所有单元工厂中的项目为空时,重置文本和图形。而且在 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)
| 归档时间: |
|
| 查看次数: |
49 次 |
| 最近记录: |