Tableview更新数据库在编辑
所以我想要发生的事情是让tableview在编辑后更新数据库中的数据.我想在这里使用SetOnEditCommit方法.单元格编辑确实有效,但它永远不会更新,也没有错误.首先,如果这种方法实际上是有效的(可能不是),我有点无能为力,因为很难找到这个特定事物的一些来源.我发现的消息来源并不是很有帮助.所以,如果有人知道为什么它不更新,或者可能在这里提供替代选项,那将是很好的.
提到的部分: columnType.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<UserDetails,String>>() { @Override public void handle(TableColumn.CellEditEvent<UserDetails,String> event) { updataData(); } }); tableview.setItems(null); tableview.setItems(data); } public void updataData() { Connection connection = null; try { connection = DriverManager.getConnection("jdbc:mysql://37.128.148.113:3306/FYS","FYS","Kcj8g87~"); Statement con = connection.createStatement(); //connection TablePosition pos = tableview.getSelectionModel().getSelectedCells().get(0); int row = pos.getRow(); TableColumn col = pos.getTableColumn(); String data1 = (String) col.getCellObservableValue(row).getValue(); //cell UserDetails row1 = tableview.getSelectionModel().getSelectedItem(); c1 = row1.getId(); //row //tableview variables con.execute("UPDATE gevonden_bagage SET type = 'data1' WHERE koffer_id = 'c1' "); //Query } catch (SQLException ex) { System.err.println("Error" + ex); } } //get connection,get celldata,get id data from first row,update cell with selected id 完全控制器类: package simple; import java.net.URL; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ResourceBundle; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TablePosition; import javafx.scene.control.TableView; import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.control.cell.TextFieldTableCell; /** * * @author admin */ public class FXMLUserController extends SimpleController implements Initializable { @FXML public TableView<UserDetails> tableview; @FXML public TableColumn<UserDetails,String> columnId; @FXML public TableColumn<UserDetails,String> columnType; @FXML public TableColumn<UserDetails,String> columnKleur; @FXML public TableColumn<UserDetails,String> columnLuchthaven; @FXML public TableColumn<UserDetails,String> columnKenmerken; @FXML public TableColumn<UserDetails,String> columnStatus; @FXML public TableColumn<UserDetails,String> columnDatum; @FXML private Button btnLoad; //declare observable list for database data private ObservableList<UserDetails> data; private DbConnection dc; String c1; @FXML //strings for getRow method @Override public void initialize(URL url,ResourceBundle rb) { dc = new DbConnection(); loadDataFromDatabase(); } @FXML public void loadDataFromDatabase() { try { Connection conn = dc.Connect(); data = FXCollections.observableArrayList(); // Execute query and store result in a resultset ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM gevonden_bagage"); while (rs.next()) { //get strings data.add(new UserDetails(rs.getString(1),rs.getString(2),rs.getString(3),rs.getString(4),rs.getString(5),rs.getString(6),rs.getString(7))); } } catch (SQLException ex) { System.err.println("Error" + ex); } //Set cell values to tableview. tableview.setEditable(true); tableview.getSelectionModel().setCellSelectionEnabled(true); columnType.setCellFactory(TextFieldTableCell.forTableColumn()); columnKleur.setCellFactory(TextFieldTableCell.forTableColumn()); columnLuchthaven.setCellFactory(TextFieldTableCell.forTableColumn()); columnKenmerken.setCellFactory(TextFieldTableCell.forTableColumn()); columnStatus.setCellFactory(TextFieldTableCell.forTableColumn()); columnDatum.setCellFactory(TextFieldTableCell.forTableColumn()); //makes columns editable columnId.setCellValueFactory(new PropertyValueFactory<>("id")); columnType.setCellValueFactory(new PropertyValueFactory<>("type")); columnKleur.setCellValueFactory(new PropertyValueFactory<>("kleur")); columnLuchthaven.setCellValueFactory(new PropertyValueFactory<>("luchthaven")); columnKenmerken.setCellValueFactory(new PropertyValueFactory<>("kenmerken")); columnStatus.setCellValueFactory(new PropertyValueFactory<>("status")); columnDatum.setCellValueFactory(new PropertyValueFactory<>("datum")); columnType.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<UserDetails,update cell with selected id @FXML public void getRow() { TablePosition pos = tableview.getSelectionModel().getSelectedCells().get(0); int row = pos.getRow(); TableColumn col = pos.getTableColumn(); // this gives the value in the selected cell: String data1 = (String) col.getCellObservableValue(row).getValue(); System.out.println(data1); //CURRENTLY UNUSED METHOD } } 型号类: import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; /** * * @author admin */ public class UserDetails { private final StringProperty id; private final StringProperty type; private final StringProperty kleur; private final StringProperty luchthaven; private final StringProperty kenmerken; private final StringProperty status; private final StringProperty datum; //Default constructor public UserDetails(String id,String type,String kleur,String luchthaven,String kenmerken,String status,String datum) { this.id = new SimpleStringProperty(id); this.type = new SimpleStringProperty(type); this.kleur = new SimpleStringProperty(kleur); this.luchthaven = new SimpleStringProperty(luchthaven); this.kenmerken = new SimpleStringProperty(kenmerken); this.status = new SimpleStringProperty(status); this.datum = new SimpleStringProperty(datum); } //getters public String getId() { return id.get(); } public String getType() { return type.get(); } public String getKleur() { return kleur.get(); } public String getLuchthaven() { return luchthaven.get(); } public String getKenmerken() { return kenmerken.get(); } public String getStatus() { return status.get(); } public String getDatum() { return datum.get(); } //setters public void setId(String value) { id.set(value); } public void setType(String value) { type.set(value); } public void setKleur(String value) { kleur.set(value); } public void setLuchthaven(String value) { luchthaven.set(value); } public void setKenmerken(String value) { kenmerken.set(value); } public void setStatus(String value) { status.set(value); } public void setDatum(String value) { datum.set(value); } //property values public StringProperty idProperty() { return id; } public StringProperty typeProperty() { return type; } public StringProperty kleurProperty() { return kleur; } public StringProperty luchthavenProperty() { return luchthaven; } public StringProperty kenmerkenProperty() { return kenmerken; } public StringProperty statusProperty() { return status; } public StringProperty datumProperty() { return datum; } } 解决方法从TableView documentation:
所以问题是通过在columnType上设置onEditCommit,可以删除实际更新UserDetails实例中的typeProperty的默认处理程序.所以 String data1 = (String) col.getCellObservableValue(row).getValue(); 给出旧值,对数据库的更新不会改变任何内容. 此外,您在创建SQL语句的方式中存在错误.您在WHERE子句中使用文字值’c1′(而不是变量c1中包含的值,而类似地将type的值设置为文字值’data1′,而不是变量data1中的值. 这是一个修复,以及代码的一些简化和一些避免SQL injection attacks的更好的实践: columnType.setOnEditCommit(event -> { UserDetails user = event.getRowValue(); user.setType(event.getNewValue()); updateData("type",event.getNewValue(),user.getId()); }); 接着 private void updateData(String column,String newValue,String id) { // btw it is way better to keep the connection open while the app is running,// and just close it when the app shuts down.... // the following "try with resources" at least makes sure things are closed: try ( Connection connection = DriverManager.getConnection("jdbc:mysql://37.128.148.113:3306/FYS","Kcj8g87~"); PreparedStatement stmt = connection.prepareStatement("UPDATE gevonden_bagage SET "+column+" = ? WHERE koffer_id = ? "); ) { stmt.setString(1,newValue); stmt.setString(2,id); stmt.execute(); } catch (SQLException ex) { System.err.println("Error"); // if anything goes wrong,you will need the stack trace: ex.printStackTrace(System.err); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |