【问题标题】:Showing wrapped bean property in JavaFX TableView在 JavaFX TableView 中显示包装的 bean 属性
【发布时间】:2013-04-10 12:45:12
【问题描述】:

我正在尝试使用 TableView 来显示用户创建的一些数据,但不幸的是,一些具体的列内容没有显示。有问题的列是一种两级 bean,或者换句话说,是一个包装的 bean:

省略了获取器和设置器

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

【问题讨论】:

    标签: java javafx-2 javabeans


    【解决方案1】:

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

    public class VisaoProdutoPreVenda{
        private SimpleIntegerProperty id;
        private SimpleIntegerProperty idProduto;
        ...
    
        public SimpleIntegerProperty idProperty(){
            return id;
        }
    }
    

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

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

    【讨论】:

    • 如果我在 ItemBean 中创建一个 getProdutoId() 只是简单地返回 return produto.getId() 它是相同的代码,没有对属性进行任何更改...也许更好的解决方案是创建我自己的 CellValueFactory。跨度>
    • 您的替代方案应该可以正常工作。请注意,如果您想允许在TableView 中进行编辑,那么您需要切换到使用属性或继续实现自定义CellFactoryCellValueFactory 可以工作,但如果没有绑定,您将不得不手动处理编辑。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-17
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 1970-01-01
      相关资源
      最近更新 更多