Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Formatieren der Datumsspalte in javaFX TableView für Daten, die aus Oracle DB abgerufen wurden

Sie haben einfach vergessen, IDs in Ihre Spalten einzufügen... Es muss so sein:

<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />

Ohne sie bleibt Ihr MRN-Feld in der "initialize"-Methode "null", weil der FXMLLoader kein passendes (nach ID) Feld in der fxml-Datei findet. Meiner Meinung nach, während zwei Felder mit Namen, die sich nur durch Groß- und Kleinschreibung unterscheiden (in Ihr Code, zum Beispiel das TextField "mrn" und die TableColumn "MRN") funktioniert tatsächlich, es ist ziemlich verwirrend.

Außerdem gibt es Probleme mit Ihrem Datenmodell und mit Ihrer Methode populateData:

  • Zuallererst sollte Ihre TableView vom Typ Person sein, nicht List:Person ist der Datentyp, den Ihre Tabelle enthalten wird. Folglich sollten die TableColumns als TableColumn
  • deklariert werden
  • Zweitens müssen Sie sich entscheiden, ob Sie FXML oder Java-Code verwenden möchten. Sie haben die Spalten bereits in der Tabelle (über FXML), aber in Ihrer populateData-Methode löschen Sie sie und versuchen, sie erneut hinzuzufügen. Wenn Sie die Spalten vorher kennen, verwenden Sie einfach FXML und schneiden Sie diesen Teil Ihrer populateData-Methode weg
  • Drittens, wenn Sie die Ergebnisse lesen, die Sie aus der Datenbank erhalten, sollten Sie ein Personenobjekt für jede Zeile erstellen und dieses Objekt dann zu Ihrer Datenliste hinzufügen. Etwa so:

            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);
            } 
    

Versuchen Sie, Ihrem Code mit einem Debugger zu folgen, er hilft Ihnen beim Verständnis.

Für die Datumsformatierung schlage ich vor, einen DateTimeFormatter zu verwenden:

DATEOFBIRTH.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
DATEOFBIRTH.setCellFactory(new PersonController.ColumnFormatter<>(DateTimeFormatter.ofPattern("MM/dd/yyyy")));

und ändern Sie ColumnFormatter auf diese Weise:

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));
                }
            }
        };
    }
}