Ajuda com JTable

Fala ai gente, tenho o seguinte problema:

Criei um table model e um método que retorna uma lista para popular meu JTable com dados do banco, porém os dados não estão sendo exibidos no JTable
somente as linhas, segui as classes.

Table model

 view;  
  
import java.util.ArrayList;  
import java.util.List;  
  
import javax.swing.table.AbstractTableModel;  
  
import entity.Contato;  
  
public class ModeleDeTabela  extends AbstractTableModel{  
  
    private String [] colunas= {"Nome","Sobre Nome","Tipo","Sexo"};  
    private List<Contato>linhas;  
      
    public ModeleDeTabela() {  
        linhas = new ArrayList<Contato>();  
}  
      
    public ModeleDeTabela(List<Contato> contato) {  
            linhas = new ArrayList<Contato>(contato);  
      
      
    }  
    public int getColumnCount() {  
        return colunas.length;  
    }  
      
    @Override  
    public boolean isCellEditable(int rowIndex, int columnIndex) {  
        return true;  
    }  
    public String getColumnName(int indexColuna){  
        return colunas[indexColuna];  
    }  
  
    public Class<?> getColumnClass(int columnIndex) {    
        //Qual a classe das nossas colunas? Como estamos exibindo texto, é string.    
        return String.class;  
    }  
    public void addLinhas(Contato c){  
    linhas.add(c);  
    }  
      
    @Override  
    public int getRowCount() {  
            return linhas.size();  
    }  
      
      
    @Override  
    public Object getValueAt(int Indexlinhas, int IndexColuna) {  
        Contato c = new Contato();  
        linhas.get(Indexlinhas);  
        Object linhasOB = null;  
        switch(IndexColuna){  
          
        case 0: linhasOB = c.getNome();  
        break;  
        case 1: linhasOB = c.getSobrenome();  
        break;  
        case 2: linhasOB = c.getTipo();  
        break;  
        case 3: linhasOB = c.getSexo();  
        }  
          
        return linhasOB;  
    }  
      
          
      
      
}  

método que retorna a lista

public List<Contato> buscarContato( ) throws Exception{  
  
Conexao conexao = new Conexao();  
conexao.abrirConexao();  
String sql = "select*from contatos " ;   
PreparedStatement pstm = conexao.con.prepareStatement(sql);  
    ResultSet rs = pstm.executeQuery();  
List<Contato> lista = new ArrayList<Contato>();  
    while(rs.next()){  
        Contato c  = new Contato();  
        c.setNome(rs.getString("nome"));  
        c.setSobrenome(rs.getString("sobrenome"));  
        c.setTipo(rs.getString("tipo"));  
        c.setSexo(rs.getString("sexo"));  
            lista.add(c);  
    }  
conexao.fecharConexao();  
return lista;  

tabela no JFrame

table = new JTable();  
        ContatoDAO dao = new ContatoDAO();  
  
        try {  
        } catch (Exception e1) {  
            // TODO Auto-generated catch block  
            e1.printStackTrace();  
        }   
        try {  
            ModeleDeTabela minha = new ModeleDeTabela(dao.buscarContato());  
            table.setModel(minha);  
            scrollPane.setViewportView(table);  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
          

ajuda ai gente :wink:

Seu código está assim:

 @Override    
    public Object getValueAt(int Indexlinhas, int IndexColuna) {    
        Contato c = new Contato();    
        linhas.get(Indexlinhas);    
        Object linhasOB = null;    
        switch(IndexColuna){    
            
        case 0: linhasOB = c.getNome();    
        break;    
        case 1: linhasOB = c.getSobrenome();    
        break;    
        case 2: linhasOB = c.getTipo();    
        break;    
        case 3: linhasOB = c.getSexo();    
        }    
            
        return linhasOB;    
    }    

Será que deveria estar assim:

@Override    
    public Object getValueAt(int Indexlinhas, int IndexColuna) {    
        Contato c = linhas.get(Indexlinhas);    //linhas deverá estar instanciada e com os contatos;
        Object linhasOB = null;    
        switch(IndexColuna){                
          case 0: linhasOB = c.getNome();    
          break;    
          case 1: linhasOB = c.getSobrenome();    
          break;    
          case 2: linhasOB = c.getTipo();    
          break;    
          case 3: linhasOB = c.getSexo();    
        }    
            
        return linhasOB;    
    }    

CARAMBA! Funcionou, só não entendi pq ?

vou dar uma estudada melhor nesse table model.

BRIGADÃO AMIGO.

Além disso, faltou chamar o fireTableRowsInserted no método add.

Seria o ideal criar um método addAll, que você passasse a lista diretamente ao model. E desse esse fire uma vez só.

Ou então, use o ObjectTableModel, do projeto Towel.

[quote=ViniGodoy]Além disso, faltou chamar o fireTableRowsInserted no método add.

Seria o ideal criar um método addAll, que você passasse a lista diretamente ao model. E desse esse fire uma vez só.

Ou então, use o ObjectTableModel, do projeto Towel.[/quote]

ViniGodoy por favor você poderia explicar qual o real motivo de chamar o fireTableRowsInserted?
Pelo que consegui entender é apenas para notificar que foi feito uma inserção?

ok

[quote=thgbarros]ViniGodoy por favor você poderia explicar qual o real motivo de chamar o fireTableRowsInserted?
Pelo que consegui entender é apenas para notificar que foi feito uma inserção?[/quote]

Sim, é para você notificar o JTable que houve uma inserção no model, assim ela se redesenha.
O JTable não tem como adivinhar que o model mudou, ele usa os métodos “fire” para avisa-la.

[quote=ViniGodoy]Além disso, faltou chamar o fireTableRowsInserted no método add.

Seria o ideal criar um método addAll, que você passasse a lista diretamente ao model. E desse esse fire uma vez só.

Ou então, use o ObjectTableModel, do projeto Towel.[/quote]

Esse método “addAll” é para adicionar todos os dados na tabela certo?

Então o meu está correto?

	model = new TabelaPesquisa(lista);
        public TabelaPesquisa(List<Cliente> lista) {
        this();
        valores.addAll(lista);
    }

Pq preciso utilizar esse “fireTableRowsInserted” ?

Edit:

Agora vi a explicação do “fireTableRowsInserted”, mesmo assim,

Obrigado;

Sim, estava correto. No construtor não é necessário chamar o fire, pois o model será adicionado a Tabela só depois de construído. Além disso, se o model está sendo criado, obviamente ele não tem listeners.

Quando você adiciona um model a um JTable, ela se registra como listener do model. E sempre que ouvir algum evento indicando que o model mudou ela se redesenhará. Por isso, existem os métodos “fire” para inserção, remoção de dados, ou mesmo para avisar a tabela que todos os dados mudaram. Existe até o fireTableStructureChanged para o model avisar que até a estrutura da tabela (número de colunas e seu tipo) mudou também.

Na minha assinatura há o link para models bem completos para JTable. Dê uma olhada neles.

Sim, estava correto. No construtor não é necessário chamar o fire, pois o model será adicionado a Tabela só depois de construído. Além disso, se o model está sendo criado, obviamente ele não tem listeners.

Quando você adiciona um model a um JTable, ela se registra como listener do model. E sempre que ouvir algum evento indicando que o model mudou ela se redesenhará. Por isso, existem os métodos “fire” para inserção, remoção de dados, ou mesmo para avisar a tabela que todos os dados mudaram. Existe até o fireTableStructureChanged para o model avisar que até a estrutura da tabela (número de colunas e seu tipo) mudou também.

Na minha assinatura há o link para models bem completos para JTable. Dê uma olhada neles.[/quote]

Hum… muito obrigado pela explicação;

Eu aprendi a usar o “AbstractTableModel” pelos links da sua assinatura, foi até em um exemplo seu que aprendi melhor a usar;

Antes eu usava o

Então eu devo adicionar os métodos “fire” na classe onde eu faço o “extends” em AbstractTableModel?

Obrigado;

Sim. O fire é a forma do TableModel avisar a tabela que o conteúdo mudou.

Então, se você fizer isso:

O TableModel adiciona o objeto a lista e fala “ei, tabela, tá na hora de repintar pq uma linha foi adicionada!”.

A tabela analisa o evento e vê que tem que adicionar um elemento abaixo, digamos, da linha 3. E ela vai lá e, se necessário, se redesenha.

Se você lembrar do modelo MVC, o TableModel, apesar do nome infeliz, representa a camada de Controle.
Ele comunica-se com a sua classe de modelo (Cliente), recebe as requisições do que é feito na tabela (setValueAt) e informa a tabela sobre mudanças no modelo (getValueAt e métodos fire).

Em aplicações web, o trânsito de requisições é feitas por chamadas get e retornos de servlets. Isso porque existe todo um protocolo de comunicação entre o servidor e o cliente (HTTP). Em aplicações desktop, como não há acesso remoto, você pode usar mecanismos da linguagem como simples chamadas e método ou listeners de eventos.

[quote=ViniGodoy]Sim. O fire é a forma do TableModel avisar a tabela que o conteúdo mudou.

Então, se você fizer isso:

O TableModel adiciona o objeto a lista e fala “ei, tabela, tá na hora de repintar pq uma linha foi adicionada!”.

A tabela analisa o evento e vê que tem que adicionar um elemento abaixo, digamos, da linha 3. E ela vai lá e, se necessário, se redesenha.

Se você lembrar do modelo MVC, o TableModel, apesar do nome infeliz, representa a camada de Controle.
Ele comunica-se com a sua classe de modelo (Cliente), recebe as requisições do que é feito na tabela (setValueAt) e informa a tabela sobre mudanças no modelo (getValueAt e métodos fire).

Em aplicações web, o trânsito de requisições é feitas por chamadas get e retornos de servlets. Isso porque existe todo um protocolo de comunicação entre o servidor e o cliente (HTTP). Em aplicações desktop, como não há acesso remoto, você pode usar mecanismos da linguagem como simples chamadas e método ou listeners de eventos.[/quote]

ViniGodoy,

Sua explicação me fez esclarecer muito melhor o TableModel, e trabalhando em cima dele, melhorei bastante meu modo de programar;

Muito obrigado pela ajuda;