sql >> Database >  >> RDS >> Oracle

Datumkolom opmaken in javaFX TableView voor gegevens opgehaald uit Oracle DB

Je bent gewoon vergeten ID's in je kolommen te zetten... Het moet zo zijn:

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

Zonder deze blijft uw MRN-veld in de "initialize"-methode "null" omdat de FXMLLoader geen overeenkomend (op ID) veld in het fxml-bestand vindt. uw code, bijvoorbeeld het TextField "mrn" en de TableColumn "MRN") werkt echt, het is nogal verwarrend.

Bovendien zijn er problemen met uw datamodel en met uw methode populateData:

  • Allereerst moet uw TableView van het type Persoon zijn, niet Lijst:Persoon is het type gegevens dat uw Tabel zal bevatten. Bijgevolg moeten de TableColumns worden gedeclareerd als TableColumn
  • Ten tweede moet u beslissen of u FXML of Java-code wilt gebruiken. Je hebt de kolommen al in de tabel (via FXML), maar in je populateData-methode wist je ze en probeer je ze opnieuw toe te voegen. Als je de kolommen van tevoren kent, gebruik dan gewoon FXML en knip dit deel van je populateData-methode weg
  • Ten derde, wanneer u de resultaten leest die u uit de database krijgt, moet u voor elke rij een Person-object maken en dat object vervolgens aan uw gegevenslijst toevoegen. Zoiets als dit:

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

Probeer je code te volgen met een debugger, het zal je helpen het te begrijpen.

Wat betreft de datumnotatie raad ik aan om een ​​DateTimeFormatter te gebruiken:

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

en wijzig ColumnFormatter op deze manier:

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. Back-up/herstel van SQL Server versus loskoppelen/bijvoegen

  2. Oracle, Connect By rownum

  3. SubSonic 3 en MySQL, het verwijderen van onderstrepingstekens uit de kolomnaam in de CleanUp()-methode veroorzaakt uitzonderingen bij het gebruik van een eigenschap in linq-query

  4. Wat is het gemiddelde salaris van een SQL-ontwikkelaar?