在JavaFX TableView中显示包装的bean属性

时间:2013-04-10 12:45:13

标签: java javafx-2 javabeans

我正在尝试使用TableView来显示用户创建的一些数据,但遗憾的是,某些特定的列内容未显示。有问题的列是一种两级bean,或者换句话说,是一个包装的bean:

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 bean的三个字段,所以我尝试了这个:

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”这样的符号。我如何配置这三列来显示我想要的内容?

2 个答案:

答案 0 :(得分:0)

TableView会在搜索getter之前搜索*Property方法,所以我首先设置我的bean,以便我的字段为[type]Property(例如

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

    public SimpleIntegerProperty idProperty(){
        return id;
    }
}

然后我会从VisaoProdutoPreVenda公开ItemBean的属性。

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

答案 1 :(得分:0)

我解决了实现Callback接口的问题:

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