Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Formatando a coluna de data no javaFX TableView para dados recuperados do banco de dados Oracle


Você simplesmente esqueceu de colocar IDs em suas colunas... Tem que ser assim:
<TableColumn fx:id="MRN" prefWidth="75.0" text="C1" />
<TableColumn fx:id="LASTNAME" prefWidth="75.0" text="C2" />

Sem eles seu campo MRN no método "initialize" permanece "null" pois o FXMLLoader não encontra um campo correspondente (por ID) no arquivo fxml. seu código, por exemplo, o TextField "mrn" e o TableColumn "MRN") realmente funciona, é bastante confuso.

Além disso, há problemas com seu modelo de dados e com seu método populateData:
  • Primeiro de tudo, seu TableView deve ser do tipo Person, não List:Person é o tipo de dados que sua Table armazenará. Consequentemente, as TableColumns devem ser declaradas como TableColumn
  • Segundo, você precisa decidir se deseja usar FXML ou código Java. Você já tem as colunas na tabela (via FXML), mas no seu método populateData você as limpa e tenta adicioná-las novamente. Se você conhece as colunas de antemão, use FXML e corte essa parte do seu método populateData

  • Terceiro, ao ler os resultados obtidos do banco de dados, você deve criar um objeto Person para cada linha e, em seguida, adicionar esse objeto à sua lista de dados. Algo assim:
            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);
            } 
    

Tente seguir seu código com um depurador, isso ajudará você a entender.

Quanto à formatação de data, sugiro usar um DateTimeFormatter:
DATEOFBIRTH.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
DATEOFBIRTH.setCellFactory(new PersonController.ColumnFormatter<>(DateTimeFormatter.ofPattern("MM/dd/yyyy")));

e modifique ColumnFormatter desta forma:
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));
                }
            }
        };
    }
}