Anda hanya lupa memasukkan ID di kolom Anda... Harus seperti ini:
<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />
Tanpa mereka bidang MRN Anda dalam metode "inisialisasi" tetap "null" karena FXMLLoader tidak menemukan bidang yang cocok (berdasarkan ID) di file fxml. kode Anda, misalnya, TextField "mrn" dan TableColumn "MRN") benar-benar berfungsi, cukup membingungkan.
Selain itu ada masalah dengan model data Anda dan dengan metode Anda populateData:
- Pertama-tama TableView Anda harus bertipe Person, bukan List:Person adalah tipe data yang akan disimpan oleh Tabel Anda. Akibatnya TableColumns harus dideklarasikan sebagai TableColumn
- Kedua, Anda harus memutuskan apakah Anda ingin menggunakan FXML atau menggunakan kode Java. Anda sudah memiliki kolom di tabel (melalui FXML), tetapi dalam metode populateData Anda menghapusnya dan mencoba menambahkannya lagi. Jika Anda mengetahui kolom sebelumnya, gunakan saja FXML dan potong bagian ini dari metode populateData Anda
-
Ketiga ketika Anda membaca hasil yang Anda dapatkan dari database, Anda harus membuat objek Person untuk setiap baris dan kemudian menambahkan objek itu ke daftar data Anda. Sesuatu seperti ini:
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); }
Coba ikuti kode Anda dengan debugger, ini akan membantu Anda memahami.
Untuk format tanggal saya sarankan menggunakan DateTimeFormatter:
DATEOFBIRTH.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
DATEOFBIRTH.setCellFactory(new PersonController.ColumnFormatter<>(DateTimeFormatter.ofPattern("MM/dd/yyyy")));
dan ubah ColumnFormatter dengan cara ini:
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));
}
}
};
}
}