【问题标题】:JavaFX TableView adding extra column for same dataJavaFX TableView为相同的数据添加额外的列
【发布时间】:2017-07-30 11:31:22
【问题描述】:

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

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

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

如果我关闭应用再重新打开,TableView是正常的:

这就是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。我已经搜索过解决方案,但没有可用的解决方案(据我所知)。 有什么指点吗?

【问题讨论】:

    标签: java javafx javafx-2 javafx-tableview


    【解决方案1】:

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

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

    ...
    
    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);
    }
    
    ...
    

    【讨论】:

    • 是的!做到了。谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多