आप बस अपने कॉलम में आईडी डालना भूल गए... इसे इस तरह होना चाहिए:
<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />
उनके बिना "आरंभिक" विधि में आपका एमआरएन फ़ील्ड "शून्य" रहता है क्योंकि FXMLLoader को fxml फ़ाइल में मिलान (आईडी द्वारा) फ़ील्ड नहीं मिलती है। मेरी राय में, नामों के साथ दो फ़ील्ड होने पर जो केवल मामले से भिन्न होते हैं (में आपका कोड, उदाहरण के लिए, TextField "mrn" और TableColumn "MRN") वास्तव में काम करता है, यह काफी भ्रमित करने वाला है।
इसके अलावा, आपके डेटा मॉडल और आपकी विधि populateData के साथ समस्याएं हैं:
- सबसे पहले आपका टेबल व्यू व्यक्ति प्रकार का होना चाहिए, सूची नहीं:व्यक्ति वह डेटा प्रकार है जो आपकी तालिका में होगा। नतीजतन टेबल कॉलम को टेबल कॉलम के रूप में घोषित किया जाना चाहिए
- दूसरा, आपको यह तय करना होगा कि आप FXML का उपयोग करना चाहते हैं या जावा कोड का उपयोग करना चाहते हैं। आपके पास पहले से ही तालिका में कॉलम हैं (FXML के माध्यम से), लेकिन अपने populateData विधि में आप उन्हें साफ़ करते हैं और उन्हें फिर से जोड़ने का प्रयास करते हैं। यदि आप कॉलम पहले से जानते हैं तो बस FXML का उपयोग करें और अपनी populateData पद्धति के इस भाग को काट दें
-
तीसरा जब आप डेटाबेस से प्राप्त परिणामों को पढ़ते हैं, तो आपको प्रत्येक पंक्ति के लिए एक व्यक्ति ऑब्जेक्ट बनाना चाहिए और फिर उस ऑब्जेक्ट को अपनी डेटा सूची में जोड़ना चाहिए। कुछ इस तरह:
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));
}
}
};
}
}