2014-07-22 15 views
23

Mi sto insegnando come lavorare con le proprietà JavaFX all'interno di TableView e sto avendo problemi con alcuni tipi di proprietà. Ho un persona oggetto che contiene due proprietàProprietà JavaFX in TableView

public class Person { 

    private final StringProperty firstName; 
    private final IntegerProperty age; 

    public Person(String firstName, Integer age) { 
     this.firstName = new SimpleStringProperty(firstName); 
     this.age = new SimpleIntegerProperty(age); 
    } 


    public Integer getAge() { 
     return age.get(); 
    } 

    public void setAge(Integer age) { 
     this.age.set(age); 
    } 

    public IntegerProperty ageProperty() { 
     return age; 
    } 

    public String getFirstName() { 
     return firstName.get(); 
    } 

    public void setFirstName(String firstName) { 
     this.firstName.set(firstName); 
    } 

    public StringProperty firstNameProperty() { 
     return firstName; 
    } 

} 

Una volta creati da obiettivo è quello di utilizzare questo oggetto in un TableView. Ho creato le due colonne della tabella in questo modo.

TableColumn<Person, String> firstNameColumn = new TableColumn<Person, String>("First Name"); 
TableColumn<Person, Integer> ageColumn = new TableColumn<Person, Integer>("Age"); 

Quindi, desidero impostare il valore di cella factory utilizzando espressioni Lambda. Questo è dove sorge il problema. StringProperty firstName funziona perfettamente. Tuttavia, l'IntegerProperty mi dà l'errore messaggio "Tipo non corrispondente: non può convertire da IntegerProperty a ObservableValue<Integer>"

firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty()); 
ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty()); 

Qualcuno può far luce su ciò che sta andando male con l'ageColumn.setCellValueFactory (...)? Qualsiasi aiuto sarebbe molto apprezzato.

Grazie!

risposta

53

Una parte un po 'strana dell'API di proprietà è che IntegerProperty implementa ObservableValue<Number>, non ObservableValue<Integer>. Così, un po 'counterintuitively, è necessario

TableColumn<Person, Number> ageColumn = new TableColumn<Person, Number>("Age"); 

Per inciso, e io non sono sicuro se questo provoca problemi, ma è più comune da usare int invece di Integer per il tipo di ritorno per il metodo GET e il parametro digitare per il metodo set nella classe del modello. Corrispondono ai tipi di IntegerProperty.get() e IntegerProperty.set(...), quindi evitano solo alcuni imprevisti di auto (un) boxing.

+0

Che ha funzionato grande. Grazie per la rapida risposta e chiarimenti. –

+0

Ho fatto esattamente lo stesso esempio di Matt, un nuovo progetto solo per capirlo. Bene, ora funziona. Grazie James_D – HoNgOuRu

6

è possibile utilizzare il metodo .asObject per rendere il vostro lavoro codice
non ha bisogno di cambiare la TableColumn paramater al numero

ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject()); 

IDK cui uno è il codice meglio,
cambiare il parametro da numero o utilizzare il metodo asobject

related Link

+0

forse se lo restituisci come oggetto stamperà il metodo toString e prenderà il valore come stringa, penso che sia il comportamento predefinito – HoNgOuRu

0

Per il tipo String:

firstNameColumn.setCellValueFactory(cellData -> cellData.getValue().firstNameProperty()); 

Quando si desidera utilizzare o IntegerPropertyDoubleProperty, il setCellValueFactory(...)deve hanno un ulteriore asObject():

ageColumn.setCellValueFactory(cellData -> cellData.getValue().ageProperty().asObject()); 

Questo è necessario a causa di una decisione di progettazione cattivo di JavaFX.

Source and credits

Problemi correlati