列にIDを入力するのを忘れただけです...次のようにする必要があります:
<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />
それらがないと、FXMLLoaderがfxmlファイルで一致する(IDによる)フィールドを見つけられないため、「initialize」メソッドのMRNフィールドは「null」のままになります。コード(たとえば、TextField"mrn"とTableColumn"MRN")は実際に機能しますが、かなり混乱します。
さらに、データモデルとメソッドpopulateDataに問題があります:
- まず、TableViewはListではなくPersonタイプである必要があります。Personは、テーブルが保持するデータのタイプです。したがって、TableColumnsはTableColumnとして宣言する必要があります
- 次に、FXMLを使用するかJavaコードを使用するかを決定する必要があります。テーブルにはすでに(FXMLを介して)列がありますが、populateDataメソッドで列をクリアして、もう一度追加しようとします。事前に列がわかっている場合は、FXMLを使用して、populateDataメソッドのこの部分を切り取ってください
-
3番目に、データベースから取得した結果を読み取るときは、行ごとにPersonオブジェクトを作成してから、そのオブジェクトをデータリストに追加する必要があります。このようなもの:
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); }
デバッガーでコードをフォローしてみてください。理解するのに役立ちます。
日付の書式設定については、DateTimeFormatterを使用することをお勧めします:
DATEOFBIRTH.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
DATEOFBIRTH.setCellFactory(new PersonController.ColumnFormatter<>(DateTimeFormatter.ofPattern("MM/dd/yyyy")));
次のようにColumnFormatterを変更します:
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));
}
}
};
}
}