sql >> Databáze >  >> RDS >> Oracle

Formátování sloupce data v javaFX TableView pro data získaná z databáze Oracle

Jednoduše jste zapomněli uvést ID do svých sloupců... Musí to být takto:

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

Bez nich zůstane vaše pole MRN v metodě „initialize“ „null“, protože FXMLLoader nenajde odpovídající pole (podle ID) v souboru fxml. Podle mého názoru má dvě pole s názvy, které se liší pouze velikostí písmen (v váš kód, například TextField "mrn" a TableColumn "MRN") ve skutečnosti funguje, je to docela matoucí.

Kromě toho existují problémy s vaším datovým modelem a vaší metodou populateData:

  • V první řadě by měl být váš TableView typu Osoba, nikoli Seznam:Osoba je typ dat, která bude tabulka obsahovat. V důsledku toho by měly být TableColumns deklarovány jako TableColumn
  • Zadruhé se musíte rozhodnout, zda chcete používat FXML nebo kód Java. Sloupce v tabulce již máte (přes FXML), ale v metodě populateData je vymažete a pokusíte se je přidat znovu. Pokud znáte sloupce předem, použijte FXML a tuto část vaší metody populateData odřízněte
  • Za třetí, když čtete výsledky, které získáte z databáze, měli byste vytvořit objekt Osoba pro každý řádek a poté tento objekt přidat do seznamu dat. Něco takového:

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

Zkuste svůj kód sledovat pomocí ladicího programu, pomůže vám to pochopit.

Pokud jde o formátování data, doporučuji použít DateTimeFormatter:

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

a upravte ColumnFormatter tímto způsobem:

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. Prázdné pole jako výchozí hodnota sloupce pole PostgreSQL

  2. mysql regex_replace :jak použít regex skupinu jako náhradu

  3. transakce mysql v asp.net?

  4. Chyba přihlášení SQL Server 2008 Windows Auth:Přihlášení pochází z nedůvěryhodné domény