2013-04-10 40 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

相关问题