Oracle
 sql >> Database >  >> RDS >> Oracle

Formattazione della colonna della data in javaFX TableView per i dati recuperati da Oracle DB

Hai semplicemente dimenticato di inserire gli ID nelle tue colonne... Deve essere così:

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

Senza di essi il tuo campo MRN nel metodo "inizializza" rimane "null" perché FXMLLoader non trova un campo corrispondente (per ID) nel file fxml. Secondo me, pur avendo due campi con nomi che differiscono solo per caso (in il tuo codice, ad esempio, TextField "mrn" e TableColumn "MRN") funziona davvero, è piuttosto confuso.

Inoltre ci sono problemi con il tuo modello di dati e con il tuo metodo populateData:

  • Prima di tutto il tuo TableView dovrebbe essere di tipo Person, non List:Person è il tipo di dati che conterrà il tuo Table. Di conseguenza, le TableColumns dovrebbero essere dichiarate come TableColumn
  • Secondo, devi decidere se vuoi usare FXML o usare codice Java. Hai già le colonne nella tabella (tramite FXML), ma nel tuo metodo populateData le cancelli e provi ad aggiungerle di nuovo. Se conosci le colonne in anticipo, usa semplicemente FXML e taglia via questa parte del tuo metodo populateData
  • Terzo, quando leggi i risultati che ottieni dal database, dovresti creare un oggetto Persona per ogni riga e quindi aggiungere quell'oggetto al tuo elenco di dati. Qualcosa del genere:

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

Prova a seguire il tuo codice con un debugger, ti aiuterà a capire.

Per quanto riguarda la formattazione della data, suggerisco di utilizzare un DateTimeFormatter:

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

e modifica ColumnFormatter in questo modo:

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