Oracle
 sql >> база данни >  >> RDS >> Oracle

Форматиране на колона за дата в javaFX TableView за данни, извлечени от Oracle DB

Просто сте забравили да поставите идентификатори във вашите колони... Трябва да е така:

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

Без тях вашето MRN поле в метода "initialize" остава "null", защото FXMLLoader не намира съответстващо (по ID) поле във fxml файла. Според мен, докато има две полета с имена, които се различават само по регистър (в вашият код, например TextField "mrn" и TableColumn "MRN") всъщност работи, това е доста объркващо.

Освен това има проблеми с вашия модел на данни и с вашия метод populateData:

  • На първо място, вашият TableView трябва да е от тип Person, а не List:Person е типът данни, които вашата таблица ще съдържа. Следователно TableColumns трябва да бъдат декларирани като TableColumn
  • Второ, трябва да решите дали искате да използвате FXML или Java код. Вече имате колоните в таблицата (чрез FXML), но във вашия метод populateData ги изчиствате и се опитвате да ги добавите отново. Ако знаете колоните предварително, тогава просто използвайте FXML и изрежете тази част от вашия метод populateData
  • Трето, когато четете резултатите, които получавате от базата данни, трябва да създадете обект Person за всеки ред и след това да добавите този обект към вашия списък с данни. Нещо подобно:

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

Опитайте да следвате кода си с програма за отстраняване на грешки, това ще ви помогне да разберете.

Що се отнася до форматирането на датата, предлагам да използвате DateTimeFormatter:

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

и променете ColumnFormatter по този начин:

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. Как да получите име на клас драйвер (не име на драйвер) от jdbc връзка

  2. Изберете подробности за база данни и имена на таблици в iSQL plus

  3. Защо NVL винаги оценява 2-ри параметър

  4. Oracle ODP.net Управляван срещу неуправляван драйвер

  5. Как да поставя стойности по подразбиране за всяка колона в таблицата?