2017-07-30 8 views
0

私は小さなアプリを持っています。このアプリでは、MySQLデータベースに新しい従業員レコードを追加して、これらのレコードを表示することができます。 buildData()は、データベースからデータを取得してTableViewに表示します。また、新しいレコードがTableViewを「更新」するたびにこのメソッドを呼び出します。しかし、これは期待どおりに動作していません。同じデータに余分な列を追加するJavaFX TableView

enter image description here

の場合:

enter image description here

私は別のレコードを追加するには、ボタンを押して、これは私が得るものです:

この

は、最初のレコードが追加された後の図であります私は、アプリケーションを閉じて、それを開く、TableViewは正常です:

enter image description here

これは、その後

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

し、データベースに新しい従業員レコードを追加する方法(方法は型チェックし、すべてのthat.Probablyに原因を無視?)buildData()メソッドは次のようになります。

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クラス:PURを使用して

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

アムe Java、FXMLはありません。私は解決策を探しましたが、利用可能なものはありません(私が知る限り)。 ポインタはありますか?

答えて

1

buildDataメソッドでは、アイテムを置き換えます。ただし、列を削除せずにcolumnsリストに新しいTableColumnを追加します。このようにして、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); 
} 

... 
+0

うん!それがそれでした。ありがとうございました –

関連する問題