Du har simpelthen glemt at sætte ID'er i dine kolonner... Det skal være sådan her:
<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />
Uden dem forbliver dit MRN-felt i "initialize"-metoden "nul", fordi FXMLLoader ikke finder et matchende (ved ID) felt i fxml-filen. din kode, for eksempel TextField "mrn" og TableColumn "MRN") fungerer faktisk, det er ret forvirrende.
Desuden er der problemer med din datamodel og med din metode populateData:
- Først og fremmest skal din TableView være af typen Person, ikke List:Person er den type data, som din tabel vil indeholde. Derfor skal TableColumns erklæres som TableColumn
- For det andet skal du beslutte, om du vil bruge FXML eller bruge Java-kode. Du har allerede kolonnerne i tabellen (via FXML), men i din populateData-metode rydder du dem og prøver at tilføje dem igen. Hvis du kender kolonnerne på forhånd, skal du bare bruge FXML og skære denne del af din populateData-metode væk
-
For det tredje, når du læser de resultater, du får fra databasen, skal du oprette et Person-objekt for hver række og derefter tilføje dette objekt til din dataliste. Noget som dette:
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); }
Prøv at følge din kode med en debugger, det vil hjælpe dig med at forstå.
Med hensyn til datoformatering foreslår jeg at bruge en DateTimeFormatter:
DATEOFBIRTH.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
DATEOFBIRTH.setCellFactory(new PersonController.ColumnFormatter<>(DateTimeFormatter.ofPattern("MM/dd/yyyy")));
og modificer ColumnFormatter på denne måde:
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));
}
}
};
}
}