0

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

4

2 回答 2

0

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

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"));
于 2013-04-10T21:53:57.940 回答
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"));
    .....
}
于 2013-04-15T14:04:51.473 回答