Просто сте забравили да поставите идентификатори във вашите колони... Трябва да е така:
<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />
Без тях вашето MRN поле в метода "initialize" остава "null", защото FXMLLoader не намира съответстващо (по ID) поле във fxml файла. Според мен, докато има две полета с имена, които се различават само по регистър (в вашият код, например TextField "mrn" и TableColumn "MRN") всъщност работи, това е доста объркващо.
Освен това има проблеми с вашия модел на данни и с вашия метод populateData:
- На първо място, вашият TableView трябва да е от тип Person, а не List:Person е типът данни, които вашата таблица ще съдържа. Следователно TableColumns трябва да бъдат декларирани като TableColumn
- Второ, трябва да решите дали искате да използвате FXML или Java код. Вече имате колоните в таблицата (чрез FXML), но във вашия метод populateData ги изчиствате и се опитвате да ги добавите отново. Ако знаете колоните предварително, тогава просто използвайте FXML и изрежете тази част от вашия метод populateData
-
Трето, когато четете резултатите, които получавате от базата данни, трябва да създадете обект Person за всеки ред и след това да добавите този обект към вашия списък с данни. Нещо подобно:
while (rs.next()) { Person p = new Person(); p.setMRN(rs.getString(1)); p.setLastName(rs.getString(2)); Date x = rs.getDate(3); if (x != null) { p.setDateOfBirth(rs.getDate(3).toLocalDate()); } else { p.setDateOfBirth(LocalDate.MIN); } data.add(p); }
Опитайте да следвате кода си с програма за отстраняване на грешки, това ще ви помогне да разберете.
Що се отнася до форматирането на датата, предлагам да използвате DateTimeFormatter:
DATEOFBIRTH.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
DATEOFBIRTH.setCellFactory(new PersonController.ColumnFormatter<>(DateTimeFormatter.ofPattern("MM/dd/yyyy")));
и променете ColumnFormatter по този начин:
private class ColumnFormatter<S, T> implements Callback<TableColumn<S, T>, TableCell<S, T>> {
private final DateTimeFormatter format;
public ColumnFormatter(DateTimeFormatter format) {
super();
this.format = format;
}
@Override
public TableCell<S, T> call(TableColumn<S, T> arg0) {
return new TableCell<S, T>() {
@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setGraphic(null);
} else {
LocalDate ld = (LocalDate) item;
String val = ld.format(format);
setGraphic(new Label(val));
}
}
};
}
}