Jednoduše jste zapomněli uvést ID do svých sloupců... Musí to být takto:
<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />
Bez nich zůstane vaše pole MRN v metodě „initialize“ „null“, protože FXMLLoader nenajde odpovídající pole (podle ID) v souboru fxml. Podle mého názoru má dvě pole s názvy, které se liší pouze velikostí písmen (v váš kód, například TextField "mrn" a TableColumn "MRN") ve skutečnosti funguje, je to docela matoucí.
Kromě toho existují problémy s vaším datovým modelem a vaší metodou populateData:
- V první řadě by měl být váš TableView typu Osoba, nikoli Seznam:Osoba je typ dat, která bude tabulka obsahovat. V důsledku toho by měly být TableColumns deklarovány jako TableColumn
- Zadruhé se musíte rozhodnout, zda chcete používat FXML nebo kód Java. Sloupce v tabulce již máte (přes FXML), ale v metodě populateData je vymažete a pokusíte se je přidat znovu. Pokud znáte sloupce předem, použijte FXML a tuto část vaší metody populateData odřízněte
-
Za třetí, když čtete výsledky, které získáte z databáze, měli byste vytvořit objekt Osoba pro každý řádek a poté tento objekt přidat do seznamu dat. Něco takového:
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); }
Zkuste svůj kód sledovat pomocí ladicího programu, pomůže vám to pochopit.
Pokud jde o formátování data, doporučuji použít DateTimeFormatter:
DATEOFBIRTH.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
DATEOFBIRTH.setCellFactory(new PersonController.ColumnFormatter<>(DateTimeFormatter.ofPattern("MM/dd/yyyy")));
a upravte ColumnFormatter tímto způsobem:
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));
}
}
};
}
}