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