我正在编写一个动态填充javafx表视图的程序。一切都很正常,我可以反复使用相同的方法用不同查询的信息填充多个表。我看到有很多问题,但我就是找不到解决这个问题的答案。
我的代码是基于这个问题的答案。
但是,我的问题只有在稍后尝试在代码中为按钮分配功能时才会出现。我能够多次从链接调用上述方法来填充多个表,并且我已经尝试显式地调用连接上的.close(),并在我的各种方法中将其作为局部变量重新打开,这样每次调用该方法时都会重新打开它,还将连接示例化为类变量。我只是不明白为什么我会继续接受这个地区尽管一切。一般来说,我对编码比较陌生,所以我确信我遗漏了一些关于连接如何工作的信息。
另外,如果有人对如何在对.db文件进行更改后更新tableview有任何建议,那也很好。
下面是我的具体方法,它使用上面答案中的代码。我所做的唯一修改是,我为它提供了一个输入查询的参数,以及我要在其上显示我正在显示的三个表的查询结果的关联表,这对于填充表非常有用:
下面有一个上下文截图。
public void buildData(String query, TableView table) {
data = FXCollections.observableArrayList();
try {
//SQL FOR SELECTING ALL OF CUSTOMER
String SQL = query;
//ResultSet
ResultSet rs = c.createStatement().executeQuery(SQL);
for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
//We are using non property style for making dynamic table
final int j = i;
TableColumn 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());
}
});
col.setMinWidth(200);
table.getColumns().addAll(col);
System.out.println("Column [" + i + "] ");
}
while (rs.next()) {
//Iterate Row
ObservableList<String> row = FXCollections.observableArrayList();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
//Iterate Column
row.add(rs.getString(i));
}
System.out.println("Row [1] added " + row);
data.add(row);
}
//FINALLY ADDED TO TableView
table.setItems(data);
} catch (Exception e) {
e.printStackTrace();
System.out.println("Error on Building Data");
}
}
数据库锁定错误的问题出现在这里,在我单击“add”按钮时使用的这个方法中,我认为使用相同的连接c会产生不同的效果,但事实并非如此。另外,如我所说,我尝试在每次使用后关闭连接在每个方法的顶部打开一个新的连接,但它仍然声称连接保持打开状态,并且数据库正忙,从而导致数据库锁定错误:
public void addTenant(String name, double leaseLength, boolean rentPaid, String propID, TableView table) {
data = FXCollections.observableArrayList();
try {
//SQL FOR SELECTING ALL OF CUSTOMER
String query = "INSERT INTO tenants VALUES (?,?,?,?)";
//ResultSet
PreparedStatement statement = c.prepareStatement(query);
statement.setString(1, name);
statement.setDouble(2, leaseLength);
statement.setBoolean(3, rentPaid);
statement.setString(4, propID);
ResultSet rs = c.createStatement().executeQuery("SELECT * FROM tenants");
for (int i = 0; i < rs.getMetaData().getColumnCount(); i++) {
//We are using non property style for making dynamic table
final int j = i;
TableColumn 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());
}
});
col.setMinWidth(200);
table.getColumns().addAll(col);
System.out.println("Column [" + i + "] ");
}
while (rs.next()) {
//Iterate Row
ObservableList<String> row = FXCollections.observableArrayList();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
//Iterate Column
row.add(rs.getString(i));
}
System.out.println("Row [1] added " + row);
data.add(row);
}
//FINALLY ADDED TO TableView
table.setItems(data);
} catch (Exception e) {
e.printStackTrace();
System.out.println("Error on Building Data");
}
}
这是一个单一的功能按钮,从文本字段中提取输入。这就是为什么查询在这里是硬编码的,但是从textfield.gettext()方法中获取这些输入,以便为表添加一个“租户”(想想租金管理系统。)在最初准备好的语句之后的第二个rs是我尝试在添加到表之后从表中获取新信息,可能在表被添加到后重新填充。我无法测试这个,因为我无法使它通过sqlite数据库锁定错误
最后
以下是我的表的屏幕截图,如果这有助于将其引入上下文,我需要在“添加”租户时更新所有表,但显然只有在“添加”按钮具有功能后,由于数据库锁定错误,当前无法更新:
表格截图
暂无答案!
目前还没有任何答案,快来回答吧!