Vous avez tout simplement oublié de mettre des identifiants dans vos colonnes... Il faut que ce soit comme ça :
<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />
Sans eux, votre champ MRN dans la méthode "initialize" reste "null" car le FXMLLoader ne trouve pas de champ correspondant (par ID) dans le fichier fxml. À mon avis, tout en ayant deux champs avec des noms qui ne diffèrent que par la casse (dans votre code, par exemple, le TextField "mrn" et le TableColumn "MRN") fonctionne réellement, c'est assez déroutant.
De plus, il y a des problèmes avec votre modèle de données et avec votre méthode populateData :
- Tout d'abord, votre TableView doit être de type Person, et non List :Person est le type de données que votre table contiendra. Par conséquent, les TableColumns doivent être déclarées comme TableColumn
- Deuxièmement, vous devez décider si vous souhaitez utiliser FXML ou utiliser du code Java. Vous avez déjà les colonnes dans la table (via FXML), mais dans votre méthode populateData, vous les effacez et essayez de les ajouter à nouveau. Si vous connaissez les colonnes à l'avance, utilisez simplement FXML et coupez cette partie de votre méthode populateData
-
Troisièmement, lorsque vous lisez les résultats que vous obtenez de la base de données, vous devez créer un objet Person pour chaque ligne, puis ajouter cet objet à votre liste de données. Quelque chose comme ça :
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); }
Essayez de suivre votre code avec un débogueur, cela vous aidera à comprendre.
En ce qui concerne le formatage de la date, je suggère d'utiliser un DateTimeFormatter :
DATEOFBIRTH.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
DATEOFBIRTH.setCellFactory(new PersonController.ColumnFormatter<>(DateTimeFormatter.ofPattern("MM/dd/yyyy")));
et modifiez ColumnFormatter de cette façon :
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));
}
}
};
}
}