如何为JFXTableView添加编辑删除按钮并同步编辑内容到SQL
解决方案:为JavaFX TableView添加操作列并实现编辑同步到SQL
我来帮你一步步搞定这两个需求,结合你已有的代码进行调整:
1. 添加包含编辑/删除按钮的操作列
首先,我们需要为TableElement创建一个新的TableColumn,用来放置每行的操作按钮。通过setCellFactory可以为每一行生成包含两个按钮的单元格:
// 假设你的数据实体类名为Element,对应表格中的数据模型 TableColumn<Element, Void> clmAction = new TableColumn<>("操作"); clmAction.setPrefWidth(150); // 为操作列设置单元格工厂 clmAction.setCellFactory(param -> new TableCell<Element, Void>() { private final Button btnEdit = new Button("编辑"); private final Button btnDelete = new Button("删除"); private final HBox hbox = new HBox(10, btnEdit, btnDelete); { // 给按钮加个简单样式(可选) btnEdit.setStyle("-fx-background-color: #4CAF50; -fx-text-fill: white;"); btnDelete.setStyle("-fx-background-color: #f44336; -fx-text-fill: white;"); // 编辑按钮点击事件:触发当前行的编辑状态 btnEdit.setOnAction(event -> { Element currentRow = getTableView().getItems().get(getIndex()); getTableView().edit(getIndex(), clmELement); // 指定默认进入编辑的列,比如元素名称列 }); // 删除按钮点击事件:删除行并同步到数据库 btnDelete.setOnAction(event -> { Element currentRow = getTableView().getItems().get(getIndex()); int id = currentRow.getId(); // 假设Element类有getId()方法获取主键 // 调用删除数据库记录的方法(需要你补充这个方法) supprimerElement(id); // 从表格数据源中移除该行 getTableView().getItems().remove(currentRow); }); } @Override protected void updateItem(Void item, boolean empty) { super.updateItem(item, empty); if (empty) { setGraphic(null); } else { setGraphic(hbox); } } }); // 将操作列添加到表格中 TableElement.getColumns().add(clmAction);
补充对应的删除数据库方法(和你的modifierElement风格一致):
public static void supprimerElement(int id) { try { String query = "DELETE FROM element WHERE id=?"; cnx = connecterDB(); PreparedStatement pst = cnx.prepareStatement(query); pst.setInt(1, id); pst.executeUpdate(); System.out.println("Produit bien supprimé"); } catch (SQLException e) { System.out.println(e.getMessage()); } }
2. 实现表格编辑同步到SQL数据库
你已经开启了表格的可编辑状态,但缺少编辑完成后的提交监听,我们需要为每个可编辑列添加onEditCommit事件,在用户确认编辑时调用你的更新方法同步到数据库:
首先先优化你的modifierElement方法,避免SQL注入风险(用PreparedStatement代替字符串拼接):
public static void modifierElement(int id, String nom, int prix, int qnt) { try { String query = "UPDATE element SET element=?, prix=?, quantite=? WHERE id=?"; cnx = connecterDB(); PreparedStatement pst = cnx.prepareStatement(query); pst.setString(1, nom); pst.setInt(2, prix); pst.setInt(3, qnt); pst.setInt(4, id); pst.executeUpdate(); System.out.println("Produit bien modifié"); } catch (SQLException e) { System.out.println(e.getMessage()); } }
然后为每个可编辑列添加编辑提交监听:
// 假设你的表格数据源是ObservableList<Element>,比如叫elementList ObservableList<Element> elementList = ...; // 你的SQL加载数据源 // 开启表格可编辑 TableElement.setEditable(true); // ID列(如果允许修改ID的话,否则可以跳过) clmID.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter())); clmID.setOnEditCommit(event -> { Element editedElement = event.getRowValue(); int oldId = editedElement.getId(); int newId = event.getNewValue(); editedElement.setId(newId); // 假设Element类有setId()方法 modifierElement(oldId, editedElement.getNom(), editedElement.getPrix(), editedElement.getQuantite()); }); // 元素名称列 clmELement.setCellFactory(TextFieldTableCell.forTableColumn()); clmELement.setOnEditCommit(event -> { Element editedElement = event.getRowValue(); String newNom = event.getNewValue(); editedElement.setNom(newNom); // 假设Element类有setNom()方法 modifierElement(editedElement.getId(), newNom, editedElement.getPrix(), editedElement.getQuantite()); }); // 价格列(需要字符串转整数的转换器) clmPrix.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter())); clmPrix.setOnEditCommit(event -> { Element editedElement = event.getRowValue(); int newPrix = event.getNewValue(); editedElement.setPrix(newPrix); // 假设Element类有setPrix()方法 modifierElement(editedElement.getId(), editedElement.getNom(), newPrix, editedElement.getQuantite()); }); // 数量列 clmQuantite.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter())); clmQuantite.setOnEditCommit(event -> { Element editedElement = event.getRowValue(); int newQnt = event.getNewValue(); editedElement.setQuantite(newQnt); // 假设Element类有setQuantite()方法 modifierElement(editedElement.getId(), editedElement.getNom(), editedElement.getPrix(), newQnt); });
关键注意点:
- 你的数据模型类
Element必须有对应的getter和setter方法,这样才能在编辑后更新对象属性。 - 确保表格的数据源是
ObservableList,这样表格UI会自动同步数据源的变化。 - 用
PreparedStatement代替字符串拼接SQL,能有效避免SQL注入漏洞,让代码更健壮。
内容的提问来源于stack exchange,提问作者Mosael Guilbert
相关产品推荐
相关产品推荐

