Po prostu zapomniałeś umieścić identyfikatory w swoich kolumnach... Musi być tak:
<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />
Bez nich twoje pole MRN w metodzie "initialize" pozostaje "null", ponieważ FXMLLoader nie znajduje pasującego (według ID) pola w pliku fxml. Moim zdaniem mając dwa pola o nazwach różniących się tylko wielkością liter (w Twój kod, na przykład TextField "mrn" i TableColumn "MRN") faktycznie działa, jest to dość mylące.
Ponadto występują problemy z modelem danych i metodą populateData:
- Przede wszystkim Twój TableView powinien być typu Osoba, a nie Lista:Osoba to typ danych, które przechowuje Twoja tabela. W związku z tym TableColumns powinny być zadeklarowane jako TableColumn
- Po drugie, musisz zdecydować, czy chcesz użyć FXML, czy użyć kodu Java. Masz już kolumny w tabeli (poprzez FXML), ale w metodzie populateData wyczyścisz je i spróbujesz dodać je ponownie. Jeśli znasz kolumny wcześniej, po prostu użyj FXML i odetnij tę część metody populateData
-
Po trzecie, kiedy odczytujesz wyniki otrzymane z bazy danych, powinieneś utworzyć obiekt Person dla każdego wiersza, a następnie dodać ten obiekt do swojej listy danych. Coś takiego:
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); }
Spróbuj śledzić swój kod za pomocą debugera, pomoże ci to zrozumieć.
Jeśli chodzi o formatowanie daty, sugeruję użycie DateTimeFormatter:
DATEOFBIRTH.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
DATEOFBIRTH.setCellFactory(new PersonController.ColumnFormatter<>(DateTimeFormatter.ofPattern("MM/dd/yyyy")));
i zmodyfikuj ColumnFormatter w ten sposób:
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));
}
}
};
}
}