gpt4 book ai didi

JavaFX TableView 为相同数据添加额外列

转载 作者:行者123 更新时间:2023-12-02 12:28:07 26 4
gpt4 key购买 nike

我有一个小应用程序。通过这个应用程序,我可以将新的员工记录添加到 MySQL 数据库,然后显示这些记录。 buildData() 从数据库中检索数据并将其显示在 TableView 中,每次添加新记录时我也会调用此方法以“刷新”TableView。然而,这并没有达到预期的效果。

这是添加第一条记录后的 View :

enter image description here

当我点击按钮添加另一条记录时,这就是我得到的:

enter image description here

如果我关闭应用程序并重新打开它,TableView 是正常的:

enter image description here

这就是 buildData() 方法的样子(方法忽略类型检查等。可能是原因?)

private ObservableList<ObservableList> data;

public void buildData() {
Connection c;
TableColumn col;
data = FXCollections.observableArrayList();
try {

c = DataBaseConnection.connectToDatabase();
String SQL = "SELECT * FROM employees";

ResultSet rs = c.createStatement().executeQuery(SQL);

for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {

final int j = i;
col = new TableColumn(rs.getMetaData().getColumnName(i + 1));
col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList, String>, ObservableValue<String>>() {
public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param) {
return new SimpleStringProperty(param.getValue().get(j).toString());
}
});
employeeTableView.getColumns().addAll(col);
}
while (rs.next()) {

ObservableList<String> row = FXCollections.observableArrayList();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
row.add(rs.getString(i));
}
data.add(row);
}
employeeTableView.setItems(data);

} catch (Exception e) {
e.printStackTrace();
System.out.println("Error on Building Data");
}
}

然后是向数据库添加新员工记录的方法:

 public void addEmployeeToDatabase() {

Employee employee = new Employee("Anne Droid", "Marketing", "Gender");

String query = "INSERT INTO employees (Employee_Name, Department, Gender) VALUES (?, ? , ?)";

try {
preparedStatement = connection.prepareStatement(query);

preparedStatement.setString(1, employee.getEmployeeName());
preparedStatement.setString(2, employee.getDepartment());
preparedStatement.setString(3, employee.getGender());
preparedStatement.execute();

buildData();
connection.close();

} catch (SQLException e) {
e.printStackTrace();
}
}

最后是 Employee 类:

public class Employee {

private StringProperty employeeName;
private StringProperty department;
private StringProperty gender;

public Employee() {

}

public Employee(String employeeName, String department, String gender) {
this.employeeName = new SimpleStringProperty(employeeName);
this.department = new SimpleStringProperty(department);
this.gender = new SimpleStringProperty(gender);
}

public String getEmployeeName() {
return employeeName.get();
}

public StringProperty employeeNameProperty() {
return employeeName;
}
...

我使用纯java,没有FXML。我已经搜索了解决方案,但没有一个可用(据我所知)。有什么指点吗?

最佳答案

buildData 方法中,您替换这些项目。但是,您可以将新的 TableColumn 添加到 columns 列表中,而无需删除任何列。这样,每次调用 buildData 方法时,列数都会增加。

在添加新列之前清除列表以解决此问题:

...

ResultSet rs = c.createStatement().executeQuery(SQL);

employeeTableView.getColumns().clear();

for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {

final int j = i;
col = new TableColumn(rs.getMetaData().getColumnName(i + 1));

...

employeeTableView.getColumns().add(col);
}

...

关于JavaFX TableView 为相同数据添加额外列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45399331/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com