2013-04-10 59 views
0

我想使用TableView來顯示用戶創建的一些數據,但不幸的是,某些特定的列內容不顯示。有問題的列是一種兩級豆,或者以另一種方式,一個裹着豆:在JavaFX中顯示包裝的bean屬性TableView

getter和setter方法是中省略

public class ItemBean { 

    private VisaoProdutoPreVenda produto; 
    private BigDecimal quantidade = new BigDecimal("0.0"); 
    private BigDecimal valorUnitario = new BigDecimal("0.0"); 
    private BigDecimal valorDesconto = new BigDecimal("0.0"); 
    private BigDecimal valorAcrescimo = new BigDecimal("0.0"); 
    private BigDecimal aliquotaDesconto = new BigDecimal("0.0"); 
    private BigDecimal aliquotaAcrescimo = new BigDecimal("0.0"); 
    private Integer ordem; 
    private String idVendedor; 
    private Boolean fracionado = false; 
    private boolean cancelado = false; 
    private String status = "AB"; 

} 

public class VisaoProdutoPreVenda{ 

    private int id; 
    private int idProduto;  
    private BigDecimal valorDesconto; 
    private BigDecimal quantidadeDisponivel;  
    private BigDecimal vlUnitario; 
    private int idEmpresa;  
    private Integer idLinha; 
    private int idClasse;  
    private int idSubclasse; 
    private String nomeLinha;  
    private String unidade; 
    private String descricao;  
    private String descricaoComplementar; 
    private String fracionar;  
    private int idTipoDesconto; 

} 

我想在表中使用VisaoProdutoPreVenda豆的三個字段,所以我tryied這樣的:

public class ControladorPainelPreVenda { 

    ... 

    @FXML 
    private TableView<ItemBean> tabelaItens; 
    @FXML 
    private TableColumn colunaCodigo; 
    @FXML 
    private TableColumn colunaDescricao; 
    @FXML 
    private TableColumn colunaLinha; 
    @FXML 
    private TableColumn colunaQuantidade; 
    @FXML 
    private TableColumn colunaValorLiquido; 
    @FXML 
    private TableColumn colunaValorTotal; 
    private ObservableList<ItemBean> itens = FXCollections.observableArrayList(); 

    ... 

    private void configurarTabela() { 

     /* These three first columns content aren't shown */ 

     colunaCodigo.setCellValueFactory(new PropertyValueFactory<ItemBean,String>("produto.id")); 
     colunaDescricao.setCellValueFactory(new PropertyValueFactory<ItemBean,String>("produto.descricao")); 
     colunaLinha.setCellValueFactory(new PropertyValueFactory<ItemBean,String>("produto.nomeLinha")); 
     colunaQuantidade.setCellValueFactory(new PropertyValueFactory<ItemBean,BigDecimal>("quantidade")); 
     colunaValorLiquido.setCellValueFactory(new PropertyValueFactory<ItemBean,BigDecimal>("valorLiquido")); 
     colunaValorTotal.setCellValueFactory(new PropertyValueFactory<ItemBean,BigDecimal>("valorTotal")); 
     tabelaItens.setItems(itens); 
    } 

    ... 
} 

我不知道我是否可以使用像PropertyValueFactory「produto.id」的符號。我如何配置這三列來顯示我想要的內容?

回答

0

我解決實現回調接口的問題:

public class MultiPropertyValueFactory<B,T> implements Callback<TableColumn.CellDataFeatures<B, T>, ObservableValue<T>> { 

    private String propriedade; 

    public MultiPropertyValueFactory(String propriedade) { 
     this.propriedade = propriedade; 
    } 

    @Override 
    public ObservableValue<T> call(TableColumn.CellDataFeatures<B, T> dados) { 
     Object elemento=dados.getValue(); 
     String propriedades[]=propriedade.split("\\."); 
     for(int indice=0;indice<propriedades.length;indice++){ 
      elemento=recuperarElemento(elemento,propriedades[indice]); 
     } 
     return new SimpleObjectProperty<T>((T) elemento); 
    } 

    private Object recuperarElemento(Object elemento,String propriedade) { 
     try { 

      /*using reflection here*/ 

      Method metodo = RecuperadorMetodos.recuperarMetodoGetPeloNomeDaPropriedade(elemento.getClass(),propriedade); 
      return metodo.invoke(elemento); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return new Object(); 
    } 
} 

和通過這個類的對象到setCellValueFactory()方法:

private void configurarTabela() { 
    colunaCodigo.setCellValueFactory(new MultiPropertyValueFactory<ItemBean,String>("produto.id")); 
    colunaDescricao.setCellValueFactory(new MultiPropertyValueFactory<ItemBean,String>("produto.descricao")); 
    colunaLinha.setCellValueFactory(new MultiPropertyValueFactory<ItemBean,String>("produto.nomeLinha")); 
    ..... 
} 
0

TableView是要尋找*Property方法將搜索干將之前,所以我會先設置我的豆子了,這樣我的領域是[type]Property的(如

public class VisaoProdutoPreVenda{ 
    private SimpleIntegerProperty id; 
    private SimpleIntegerProperty idProduto; 
    ... 

    public SimpleIntegerProperty idProperty(){ 
     return id; 
    } 
} 

然後我會暴露屬性的VisaoProdutoPreVendaItemBean

public class ItemBean { 
    private VisaoProdutoPreVenda produto; 
    ... 
    private String status = "AB"; 

    public SimpleIntegerProperty produtoIdProperty(){ 
     return produto.idProperty(); 
    } 
} 

更改PropertyValueFactory設置這些字段,以反映在你的bean的變化。

colunaCodigo.setCellValueFactory(new PropertyValueFactory<ItemBean,Integer>("produtoId")); 
+0

如果我創建在ItemBean一個'getProdutoId()'簡單地返回'return produto.getId()'這是相同的代碼,沒有任何改變屬性......也許更好的解決方案是創建我自己的'CellValueFactory'。 – brevleq 2013-04-11 11:44:30

+0

你的選擇應該工作正常。請注意,如果您想要在「TableView」中進行編輯,那麼您需要切換到使用屬性或繼續並實現自定義的「CellFactory」。 'CellValueFactory'可以工作,但沒有綁定,你將不得不手動處理編輯。 – OttPrime 2013-04-11 13:02:11

相關問題