Abrastract table model

olá galera do forum…
minha duvida é a seguinte

estou criando minha classe abstract tablemodel do socios do meu sistema, então
quando eu faço um select no meu banco vem os dados do sócio e do entregador pela fk,

então para garregar no jtable vai tudo bem mais para mim dar um
setValueAt() como vou fazer para setar os valores do entregador.

agradeço a ajuda

Da mesma maneira que você faz para qualquer atributo do sócio.
Quando você vai setar um valor numa determinada coluna, você identifica qual é ela (um dos argumentos deste método é a coluna em questão) e, a partir disso, você obtém o valor do atributo a ser exibido.
Exemplo, suponhamos que a coluna nome, do sócio, é a coluna 3.
Então, você verifica qual é o atributo correspondente à coluna 3 (no caso, o nome) e o devolve.
Da mesma maneria, a questão é saber qual coluna representa cada dado do entregador.
Sacou?

1 curtida

então minha classe socios tem um objeto entregador dentro:
como vou fazer para setar este objeto?

public class TableModelSocios extends AbstractTableModel{

private List<Socios> dados = new ArrayList<>();
private String[] colunas = {"idSocio","Nome Sócio","Email","Telefone Res.","Telefone Cel.","Rua","Número","Bariro",
"Cidade","Estado","Cep","Complemento","Data Cadastro","Saldo","qtd. Títulos","Situação","idEntregador", "nomeEntregador","tipoEntregador"};

public void setValueAt(Object valor, int linha, int coluna) {
    switch(coluna){
        case 0:
            dados.get(linha).setId((int) valor);
            break;
        case 1:
            dados.get(linha).setNome((String) valor);
            break;
        case 2:
            dados.get(linha).setEmail((String) valor);
            break;
        case 3:
            dados.get(linha).setTelRes((String) valor);
            break;
        case 4:
            dados.get(linha).setTelCel((String) valor);
            break;
        case 5:
            dados.get(linha).setRua((String) valor);
            break;
        case 6:
            dados.get(linha).setNumero((String) valor);
            break;
        case 7:
            dados.get(linha).setBairro((String) valor);
            break;
        case 8:
            dados.get(linha).setCidade((String) valor);
            break;
        case 9:
            dados.get(linha).setEstado((String) valor);
            break;
        case 10:
            dados.get(linha).setCep((String) valor);
            break;
        case 11:
            dados.get(linha).setComplemento((String) valor);
            break;
        case 12:
            dados.get(linha).setDataCadastro((String) valor);
            break;
        case 13:
            dados.get(linha).setSaldo((double) valor);
            break;
        case 14:
            dados.get(linha).setQtdTitulos((int) valor);
            break;
        case 15:
            dados.get(linha).setSituacao((String) valor);
            break;
        case 16:
            dados.get(linha).setEntregadores()
    }
    this.fireTableRowsUpdated(linha, linha);
}

tenho que estanciar uma classe entregador aqui??

Você tem 17 colunas (0 a 16). Precisará incluir mais 3 (referentes aos dados do entregador).
Me refiro aos cases, você tem case 0 até case 16. Se inserir os cases 17, 18 e 19, contemplará todos os dados do entregador .
Só um ponto de atenção. Cada socio possui apenas um entregador ou uma lista de entregadores? Pois, se for isso (lista), a coisa já fica mais complexa.

Ah, sim.
Temos uma abordagem que eu não gosto muito. Expor todos os dados em uma única jtable pode ficar poluído (sempre querem fazer do sistema uma extensão do excel),
A minha ideia seria exibir, na jtable, colunas coerentes com os dados principais. Mais detalhes, apenas se clicasse em um botão tipo “Ver mais” ou “Detalhes”. Então, abrir um jframe contendo os dados detalhados e completos.
Mas, essa é a minha opinião.

sim nesse caso so estou colocando o nome, o resto estou ocultando.
mas pego todos os dados pq en outro form vou presisar deles,

existe algum jeito de eu pegar so as colunas que me enteressa e jogar no form.

pq la no form estou coluna por coluna da 0 a 16
tbListarSocios.getColumnModel().getColumn(0).setPreferredWidth(0);
tbListarSocios.getColumnModel().getColumn(0).setMinWidth(0);
tbListarSocios.getColumnModel().getColumn(0).setMaxWidth(0);

existe algum jeito de simplificar isso??

E qual a razão desses dados não serem atributos de um objeto?
Você não deve depender do que é apresentado na interface de usuário.
Sua interface de usuário é que deve depender de objetos que fornecem os dados a serem apresentados.

Não precisa fazer gambiarra setando largura da coluna pra zero.
Basta você somente apresentar as colunas que deseja.
Veja os comentários no código desse exemplo:
http://www.staroski.com.br/2014/12/12/apresentar-itens-jtable/

Desculpe, vou voltar a postar as dúvidas aqui.

Então tenho que criar um modelo diferente para cada quantidade de colunas que eu desejo que retorne?

Desculpa a burrice com java, mas sou novo nessa linguagem!

Entenda uma coisa, se você é iniciante em algo, não começa pelo meio, começa pelo começo.
Quando você criar uma JTable, você precisa definir qual o modelo para ela. É aí que entre o TableModel.
Talvez não precise de N models para N quantidades, mas, quanto mais especialista a classe for, menos complexidade você tem no teu código (quantos ifs precisa para atender as variações de quantidade de colunas?)

Primeiro tens que parar de pensar em obter os valores de uma tela pra passar pra outra.

Tens que pensar que as duas telas vão manipular os mesmos objetos, neste caso, uma lista de objetos do tipo Socio.

  • No TableModel da primeira tela, o método getRowCount tem que retornar o tamanho da lista de socios;
  • O getColumCount tem que retornar 2;
  • O getColumnName tem que retornar “ID” para a primeira coluna e “NOME” para a segunda coluna;
  • O getValueAt vai obter o objeto Socio da linha informada e para a primeira coluna vai retornar o socio.getID() e para a segunda coluna vai retornar o socio.getNome();

E na outra tela você pega o mesmo objeto Socio e traz as informações adicionais que deseja utilizando outros métodos getters da classe Socio.

Então Darlan eu já li bastante sobre tableModel
E até implemente ele algumas vezes,
Mas eu ficava sentando valor zero para o Size das colunas, como mostrei antes.

E no meu tableModel eu usava o método addRow () junto com wihle.

Mas pelo jeito estava fazendo errado.

Após você é o nosso colega staroski me falarem deste jeito novo estou tentado pegar pra poder implementar no meu código.

Por isso que é extremamente importante dar uma olhada no javadoc. Ele explica (não tão claramente) como as coisas funcionam e podem auxiliar em questões como estas.

Obrigado pela força darlan que você é o staroski,
Estao me dando.

Estou apanhado um pouco com java ainda mais ainda vou estar bom igual vocês.