Заполнение TableView данными из базы данных. Не удалось установить строки
Я врезался в стену, когда извлекал данные из базы данных. Мне удалось получить имена столбцов в моей таблице, что в порядке и работает как надо.
Когда я пытаюсь добавить строки, я обнаруживаю, что в мое табличное представление не было добавлено никаких данных, я пытаюсь добавить строки из массива строк, представляющих одну строку. Я понятия не имею, сколько столбцов и т. Д. Будет запрашивать пользователь с помощью своего запроса и как большая таблица, поэтому я не могу создать объект строки и все свойства, которые представляют каждый столбец.
Вопрос Как мне заполнить мой табличный вид строками, которые я успешно извлек из базы данных в формате String [] каждой строки.
private ObservableList<String[]> dataRows=FXCollections.observableArrayList();
Получить строки .. (работает отладка печатает все данные правильно)
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;
}
}