2014-07-15 3 views
7

ho la classe successivarilegatura proprietà degli oggetti annidati a TableView in JavaFX

public class ProductStockDto extends 

    private Long id; 
    private Long amount; 
    private ProductDto product; 
    private StockDto stock; 

    //getters and setters... 
} 

In JavaFX ho mio tavolo e voglio associare la proprietà product.name alla colonna, qualcosa di simile.

ObservableList<ProductStockDto> data = FXCollections.observableArrayList(); 
data.addAll(products); 
nameColumn.setCellValueFactory(new PropertyValueFactory("product.name")); 
productTable.setItems(data); 

Ma quando lo faccio, le righe su TableView vengono visualizzate in bianco.

Qualcuno può aiutarmi con questo? Voglio associare le proprietà degli oggetti nidificati, su Java Swing era qualcosa del genere $ {product.name}

Grazie.

risposta

4

Questo formato non è supportato in Javafx, come un lavoro in giro, si può provare qualcosa di simile:

nameColumn.setCellValueFactory(new Callback<CellDataFeatures<ProductStockDto, String>, 
                 ObservableValue<String>>() { 
    @Override 
    public ObservableValue<String> call(CellDataFeatures<ProductStockDto, String> data){ 
     return data.getValue().getProducts().nameProperty(); 
    } 
}); 

dove ProductDto avrà

public class ProductDto{ 

    private StringProperty name = new SimpleStringProperty("Itachi"); 

    public String getName() { 
     return name.get(); 
    } 

    public void setStreet(String name) { 
     this.name.set(name); 
    } 

    public StringProperty nameProperty(){ 
     return name; 
    } 
} 
0
TableColumn<ProductStockDto , String> ProductNameCol = new ProductNameCol ("Product Name"); 

ProductNameCol.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ProductStockDto , String>, ObservableValue<String>>() { 

    @Override 
    public ObservableValue<String> call(TableColumn.CellDataFeatures<ProductStockDto , String> param) { 
     return new SimpleObjectProperty<>(param.getValue().ProductDto().getName()); 

    } 
}); 
+1

In genere, le risposte sono molto più utili se includono una spiegazione di ciò che il codice è destinato a fare e perché questo risolve il problema senza introdurre gli altri. –

0

se abbiamo una proprietà non è un tipo di dati java primitivo, quindi non possiamo accedervi direttamente tramite passaggi (ad esempio ProductStockDto.product.name) dove ProductStockDto è un'entità e il prodotto è un altro entità e prodotto ha proprietà Nome stringa. qui. dobbiamo rendere la colonna del nome in un TableView come ho risposto nella risposta precedente.

Inoltre, è possibile utilizzare: pacchetto javafx.beans.property.adapter per convertire oggetti javabeans in proprietà oggetto javafx bean. se vuoi codice più complesso.

2

Si può semplicemente utilizzare:

nameColumn.setCellValueFactory(new PropertyValueFactory("product")); 

Questo userà il metodo toString() dal prodotto oggetto. Tuttavia, se si fa solo questo, si può finire con qualcosa come "ProductDto @ abcef123" con il ritorno predefinito di un oggetto complesso del metodo toString.

Che cosa si può fare è quindi l'override del metodo toString:

@Override 
public String toString(){ 
    return //Whatever you want to show 
} 

Sono stato bloccato con questo, e infine a trovare questa soluzione. Spero che questo aiuti.

0

Si prega di provare il seguente codice, che utilizza Apache BeanUtils.

public class StringCellValueFactory implements 
    Callback<CellDataFeatures<Object, String>, ObservableValue<String>> { 
    private String property; 

    public StringCellValueFactory(String property) { 
     this.property = property; 
    } 

    public ObservableValue<String> call(CellDataFeatures<Object, String> param) { 
     Object value = param.getValue(); 
     String stringValue = null; 
     try { 
      stringValue = BeanUtils.getNestedProperty(value, property); 
     } catch (Exception e) { 
      logger.error("Error in StringCellValueFactory", e); 
     } 

     return new SimpleStringProperty(stringValue); 
    } 
} 
+0

Invece di org.apache.commons.beanutils.BeanUtils, org.apache.commons.beanutils.PropertyUtils possono essere utilizzati, se il valore è java.util.Date, qualsiasi oggetto definito dall'utente, ecc. –

3

Come variante si può lavorare con proprietà sintetiche.

Lascia il nome come 'productName':

nameColumn.setCellValueFactory(new PropertyValueFactory("productName")); 

Nella classe ProductStockDto avere qualcosa di simile:

public String getProductName() { 
    return product.getName(); 
} 
+0

Per qualche motivo mi ha dato un errore "Impossibile trovare un setter per proprietà foo in classe bar". L'ho risolto aggiungendo l'annotazione @Transient sopra la funzione getProductName(). E ha anche aggiunto questo nella top import javax.persistence.Transient; – MINDoSOFT

+0

+1, soluzione alternativa corretta. Sembra che tu abbia serializzazione/deserializzazione e in questo caso è prevista la coppia di get/set. L'annotazione Transitoria lo esclude dall'ambito di serializzazione/deserializzazione. –

-1

Non è necessario cambiare il vostro normale classe Java:

(no es necesario modificar tu clase convencional de java)

nameCol.setCellValueFactory(new Callback<CellDataFeatures<ProductDto, String>, ObservableValue<String>>() { 
    public ObservableValue<String> call(CellDataFeatures<ProductDto, String> p) { 
     return new ReadOnlyObjectWrapper(p.getValue().getCost()); 
    } 
    }); 
+2

Si prega di inviare solo in inglese! – FelixSFD

+1

Si prega di postare in inglese! – Seb

+0

Una traduzione del testo del rispondente sarebbe "Non è necessario modificare la normale classe Java:" –