【发布时间】:2014-08-17 15:23:27
【问题描述】:
当我从数据库中检索数据时,我碰壁了。我设法将列名输入到我的表中,这没问题,并且可以正常工作。
当我尝试添加行时,我发现没有数据添加到我的表格视图中,我试图从代表单行的字符串数组中添加行。我不知道用户会要求多少列等查询以及表有多大,所以我无法创建行对象和代表每一列的所有属性。
问题是如何用我从数据库中成功检索到的行填充我的表格视图,格式为每行的 String[]。
private ObservableList<String[]> dataRows=FXCollections.observableArrayList();
检索行..(Works debug 打印所有数据正确)
while (this.resultSet.next()) {
for (int i = 1; i < this.resultSetMd.getColumnCount() + 1; i++) {
rows.add(resultSet.getString(i));
}
dataRows.add(rows.toArray(new String[rows.size()]));
rows.removeAll(rows);
//TODO DELETE row debugger debug
dataRows.forEach((r)->{
System.out.println("Row---------");
for(String s:r){
System.out.println("Debug row value- "+s);
}
});
加入表格
private void populateTable() {
dpcontroller.tableView.getColumns().addAll(columns); //columns work
dpcontroller.tableView.setItems(dataRows); //no data entered
}
回答后编辑工作代码
为遇到与我相同问题的人提供的工作代码。唯一需要的工厂真的是 ValueFactory。这是我的两种方法
private void populateTable() {
for (int rowNumber = 0; rowNumber < dataRows.size(); rowNumber++) {
for (TableColumn tc : columns) {
tc.setCellValueFactory(new ValueFactory(columns.indexOf(tc),rowNumber));
dpcontroller.tableView.getColumns().add(tc);
}
}
dpcontroller.tableView.setItems(dataRows);
}
private class ValueFactory implements Callback {
private int rowNumber;
private int columnNumber;
public ValueFactory(int columnNumber, int rowNumber) {
this.columnNumber = columnNumber;
this.rowNumber = rowNumber;
}
@Override
public Object call(Object o) {
SimpleStringProperty stringProperty = new SimpleStringProperty(dataRows.get(rowNumber)[columnNumber]);
return stringProperty;
}
}
【问题讨论】:
-
您在哪里创建
setCellFactory? 注意: 我认为最好的方法是首先将你的 sql 行解析为一个对象,然后填充 tableview。 -
@Kyllopardiun 问题是当我不知道表有多大/用户将选择哪些列时,我无法使用对象。而且我肯定无法为所有情况创建对象。我想我知道创建对象/属性并将它们放入可观察列表很容易。然后它应该可以工作,但我不能那样做。我到底需要 cellFactory 做什么?
-
这是一个在不知道有多少列时添加列的示例。 stackoverflow.com/a/20774549/2855515 您可能可以从结果集元数据中获取标题。另一个包含大量无关代码的示例。 stackoverflow.com/a/24112797/2855515
标签: java database javafx tableview