sql >> Base de Datos >  >> RDS >> Oracle

Formateo de la columna de fecha en javaFX TableView para datos recuperados de Oracle DB

Simplemente olvidó poner ID en sus columnas... Tiene que ser así:

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

Sin ellos, su campo MRN en el método de "inicialización" sigue siendo "nulo" porque FXMLLoader no encuentra un campo coincidente (por ID) en el archivo fxml. En mi opinión, si bien tengo dos campos con nombres que difieren solo por caso (en su código, por ejemplo, TextField "mrn" y TableColumn "MRN") realmente funciona, es bastante confuso.

Además, hay problemas con su modelo de datos y con su método populateData:

  • En primer lugar, su TableView debe ser de tipo Persona, no de Lista:Persona es el tipo de datos que contendrá su Tabla. En consecuencia, TableColumns debe declararse como TableColumn
  • En segundo lugar, debe decidir si desea usar FXML o código Java. Ya tiene las columnas en la tabla (a través de FXML), pero en su método populateData las borra e intenta agregarlas nuevamente. Si conoce las columnas de antemano, simplemente use FXML y elimine esta parte de su método populateData
  • En tercer lugar, cuando lea los resultados que obtiene de la base de datos, debe crear un objeto Persona para cada fila y luego agregar ese objeto a su lista de datos. Algo como esto:

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

Intenta seguir tu código con un depurador, te ayudará a entender.

En cuanto al formato de fecha, sugiero usar un DateTimeFormatter:

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

y modifique ColumnFormatter de esta manera:

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