Du glömde helt enkelt att ange ID i dina kolumner... Det måste vara så här:
<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />
Utan dem förblir ditt MRN-fält i "initialize"-metoden "null" eftersom FXMLLoader inte hittar ett matchande (med ID) fält i fxml-filen. Enligt min mening, samtidigt som det har två fält med namn som bara skiljer sig från skiftläge (i fall) din kod, till exempel, textfältet "mrn" och tabellkolumnen "MRN") faktiskt fungerar, det är ganska förvirrande.
Dessutom finns det problem med din datamodell och med din metod populateData:
- Först och främst bör din TableView vara av typen Person, inte List:Person är den typ av data som din tabell kommer att innehålla. Följaktligen bör tabellkolumnerna deklareras som tabellkolumner
- För det andra måste du bestämma om du vill använda FXML eller använda Java-kod. Du har redan kolumnerna i tabellen (via FXML), men i din populateData-metod rensar du dem och försöker lägga till dem igen. Om du känner till kolumnerna i förväg, använd bara FXML och klipp bort den här delen av din populateData-metod
-
För det tredje när du läser resultaten du får från databasen, bör du skapa ett Person-objekt för varje rad och sedan lägga till det objektet i din datalista. Något så här:
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); }
Försök att följa din kod med en debugger, det hjälper dig att förstå.
När det gäller datumformateringen föreslår jag att du använder en DateTimeFormatter:
DATEOFBIRTH.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
DATEOFBIRTH.setCellFactory(new PersonController.ColumnFormatter<>(DateTimeFormatter.ofPattern("MM/dd/yyyy")));
och ändra ColumnFormatter så här:
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));
}
}
};
}
}