Je bent gewoon vergeten ID's in je kolommen te zetten... Het moet zo zijn:
<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />
Zonder deze blijft uw MRN-veld in de "initialize"-methode "null" omdat de FXMLLoader geen overeenkomend (op ID) veld in het fxml-bestand vindt. uw code, bijvoorbeeld het TextField "mrn" en de TableColumn "MRN") werkt echt, het is nogal verwarrend.
Bovendien zijn er problemen met uw datamodel en met uw methode populateData:
- Allereerst moet uw TableView van het type Persoon zijn, niet Lijst:Persoon is het type gegevens dat uw Tabel zal bevatten. Bijgevolg moeten de TableColumns worden gedeclareerd als TableColumn
- Ten tweede moet u beslissen of u FXML of Java-code wilt gebruiken. Je hebt de kolommen al in de tabel (via FXML), maar in je populateData-methode wist je ze en probeer je ze opnieuw toe te voegen. Als je de kolommen van tevoren kent, gebruik dan gewoon FXML en knip dit deel van je populateData-methode weg
-
Ten derde, wanneer u de resultaten leest die u uit de database krijgt, moet u voor elke rij een Person-object maken en dat object vervolgens aan uw gegevenslijst toevoegen. Zoiets als dit:
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); }
Probeer je code te volgen met een debugger, het zal je helpen het te begrijpen.
Wat betreft de datumnotatie raad ik aan om een DateTimeFormatter te gebruiken:
DATEOFBIRTH.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
DATEOFBIRTH.setCellFactory(new PersonController.ColumnFormatter<>(DateTimeFormatter.ofPattern("MM/dd/yyyy")));
en wijzig ColumnFormatter op deze manier:
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));
}
}
};
}
}