Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Formatowanie kolumny daty w javaFX TableView dla danych pobranych z bazy danych Oracle

Po prostu zapomniałeś umieścić identyfikatory w swoich kolumnach... Musi być tak:

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

Bez nich twoje pole MRN w metodzie "initialize" pozostaje "null", ponieważ FXMLLoader nie znajduje pasującego (według ID) pola w pliku fxml. Moim zdaniem mając dwa pola o nazwach różniących się tylko wielkością liter (w Twój kod, na przykład TextField "mrn" i TableColumn "MRN") faktycznie działa, jest to dość mylące.

Ponadto występują problemy z modelem danych i metodą populateData:

  • Przede wszystkim Twój TableView powinien być typu Osoba, a nie Lista:Osoba to typ danych, które przechowuje Twoja tabela. W związku z tym TableColumns powinny być zadeklarowane jako TableColumn
  • Po drugie, musisz zdecydować, czy chcesz użyć FXML, czy użyć kodu Java. Masz już kolumny w tabeli (poprzez FXML), ale w metodzie populateData wyczyścisz je i spróbujesz dodać je ponownie. Jeśli znasz kolumny wcześniej, po prostu użyj FXML i odetnij tę część metody populateData
  • Po trzecie, kiedy odczytujesz wyniki otrzymane z bazy danych, powinieneś utworzyć obiekt Person dla każdego wiersza, a następnie dodać ten obiekt do swojej listy danych. Coś takiego:

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

Spróbuj śledzić swój kod za pomocą debugera, pomoże ci to zrozumieć.

Jeśli chodzi o formatowanie daty, sugeruję użycie DateTimeFormatter:

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

i zmodyfikuj ColumnFormatter w ten sposób:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd Oracle.DataAccess

  2. Dlaczego i kiedy JAXBElement jest wymagany w JAXB?

  3. Sprawdź długość kolumny w XMLTable

  4. Jak zainstalować Universal Oracle Installer na Ubuntu?

  5. OracleException (0x80004005) podczas łączenia się z bazą danych Oracle