Setar dados na TableView em javaFX (Quando estamos diante de composição)

ola pessoal, tenho uma dúvida concernente a mostrar os dados a uma obvableList do javaFX.

Eu até ja consegui fazer isso, mas o problema é quando se trata de mostrar as informações dos atributos
de um objecto que estam dentro de outro objecto. é isso mesmo, falo de composição.

Eu tenho uma Classe Cliente, e dentro de Cliente eu tenho Pessoa. E eu quero mostrar todas os campos de pessoa
mas passando antes pelo cliente. Eis aí os modelos

public class ClienteModelo {

private int codigo;
private PessoaModelo pessoa;

private String contaCorrente;

// setters e getters


}

public class PessoaModelo {

private int codigo;
private String nome;
private String telefone;
private String email;
private String dataNascimento;
private String dataCadastro;
private String sexo;

private int codigoEStado;
private String nif;
private String numeroContribuente;
private String endereco;

//setters e getters

}


//No controller do javaFx, eu estou fazendo o seguinte

private ObservableList<ClienteModelo> observableListClient;


public void carregarTableViewClientes()
{
    colunaCodigo.setCellValueFactory(new PropertyValueFactory<>("codigo"));
    colunaNome.setCellValueFactory(new PropertyValueFactory<>("pessoa.nome"));
    colunaSexo.setCellValueFactory(new PropertyValueFactory<>("sexo"));
    colunaDataNascimento.setCellValueFactory(new PropertyValueFactory<>("dataNascimento"));
    colunaTelefone.setCellValueFactory(new PropertyValueFactory<>("telefone"));
    colunaEmail.setCellValueFactory(new PropertyValueFactory<>("email"));
    colunaEndereco.setCellValueFactory(new PropertyValueFactory<>("endereco"));
    colunaContaCorrente.setCellValueFactory(new PropertyValueFactory<>("contaCorrente"));

    List<ClienteModelo> lista = new ArrayList<>();
    
    PessoaModelo p = new PessoaModelo("nom", "tel", "email", "data nasc", "data cadas", "sexo", 1, "nif", "n contrib", "endereco");
    ClienteModelo cl = new ClienteModelo(p, "34344");
    lista.add( cl );
    
    observableListClient = FXCollections.observableArrayList(lista);
    
    tabelaClientes.setItems( observableListClient );
    
}


O problema começa aqui, eu consigo mostrar apenas o atributo conta corrente na TableView, porque está na classe Cliente,
mas se eu tentar mostrar o nome e outros atributos da classe pessoa, aí eu ja não consigo vizualizar nada.

Basicamente você criará seu próprio CellValueFactory, como abaixo:

Com Classes Internas Anônimas

colunaNome.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ClienteModelo, String>, ObservableValue<String>>() {
        @Override
        public ObservableValue<String> call(TableColumn.CellDataFeatures<ClienteModelo, String> param) {
            return new SimpleStringProperty(param.getValue().getPessoa().getNome());
        }
    });

Usando Lambda

colunaNome.setCellValueFactory((TableColumn.CellDataFeatures<ClienteModelo, String> param) -> new SimpleStringProperty(param.getValue().getPessoa().getNome()));

Usando Lambda mais ainda

colunaNome.setCellValueFactory((param) -> new SimpleStringProperty(param.getValue().getPessoa().getNome()));

O método param.getValue() da CellDataFeatures retorna o objeto do tipo ClienteModelo que está sendo processado na coluna no momento, ele espera que você retorne uma property para exibir na célula. Como seus models não usam as property do JavaFX retornei uma nova StringProperty com o dado.

7 curtidas

Obrigado Andrauss! Vou testar o código que passaste, qualquer dificuldade vou dar um toque

Maluco você caga muito grosso, valeu mesmo…

1 curtida

cara , muito obrigado , me ajudou muito , eu estava quase desistindo
da uma olhada no que estou fazendo , sofri pra por essa imagem ali dentro nesse projeto

2 curtidas

Bem bacana, parabéns.

Muito TOP. Obrigado por isso.

Como eu faço pra colocar uma imagem? funciona assim eu quero pegar 3 imagens e dependendo do status ela vai preencher essa imagens na TableView!

cara genial!!!