Como listar dados dentro da Jtable utilizando um TableModel que criei? =)

Como eu faço para listar os dados do mue Banco de Dados na minha JTable utilizando o TableModel que criei e o método de listar que tenho que busca do banco de dados??
MÉTODO LISTAR DO DAO

[code]public List listar() throws SQLException{

    Connection conn = Conexao.getConexao();

	String sql = "Select * from usuario";
	PreparedStatement stmt = conn.prepareStatement(sql);

	// Esse método é utilizado para apontar para os dados do BD
	ResultSet rs = stmt.executeQuery();

	//Cria uma lsita para armazenar os valores que serão buscados
	 List<Contato> minhaLista = new ArrayList<Contato>();

	while(rs.next()){
		// Essa Rotína pega os dados do banco e armazena nesse objeto do tipo contato
		Contato contato = new Contato(rs.getInt("idusuario"));
                    contato.setNome(rs.getString("nome"));
                    contato.setIdade(rs.getString("idade"));
                    contato.setTelefone(rs.getString("telefone"));
		//Essa rotína adiciona os dados de contato no objeto minhaLista
		minhaLista.add(contato);

	 }
	 rs.close();
	 stmt.close();
	 return minhaLista;
  }

[/code]
MÉTODO LISTAR DA REGRA DE NEGÓCIO

[code]public List listarContato() throws SQLException{

	contatoDAO cDAO = new contatoDAO();
        return cDAO.listar();
}[/code]

vle galerinha…(vlw Viny e Mark_Ameba)

Cade seu TableModel?

TA AQUI…

[code]import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

public class ContatoTableModel extends AbstractTableModel {
private static final int COL_NOME = 0;
private static final int COL_IDADE = 1;
private static final int COL_TELEFONE = 1;

private List<Contato> valores;   

// Esse é um construtor, que recebe a nossa lista de livros   
public ContatoTableModel(List<Contato> valores) {   
    this.valores = new ArrayList<Contato>(valores);   
}   

public int getRowCount() {   
    // Quantas linhas tem sua tabela? Uma para cada item da lista.   
    return valores.size();   
}   

public int getColumnCount() {   
    // Quantas colunas tem a tabela? Nesse exemplo, só 2.   
    return 2;   
}   

public String getColumnName(int columnIdx) {   
    // Qual é o nome das nossas colunas?   
    if (columnIdx == COL_NOME)   
        return "Nome";   
    if (columnIdx == COL_IDADE)   
        return "Idade";   
    if (columnIdx == COL_TELEFONE)   
        return "Tel.";   
    return ""; // Nunca deve ocorrer   
}   

public Object getValueAt(int row, int column) {   
    // Precisamos retornar o valor da coluna column e da linha row.   
    Contato con = valores.get(row);   
    if (column == COL_NOME)   
        return con.getNome();   
    if (column == COL_IDADE)   
        return con.getIdade();   
    if (column == COL_TELEFONE)   
        return con.getTelefone();   
    return ""; // Nunca deve ocorrer   
}   

public void setValueAt(Object aValue, int rowIndex, int columnIndex) {   
    // Vamos alterar o valor da coluna columnIndex na linha rowIndex com o   
    // valor aValue passado no parâmetro.   
    // Note que vc poderia alterar 2 campos ao invés de um só.   
    Contato con = valores.get(rowIndex);   
    if (columnIndex == COL_NOME)   
        con.setNome(aValue.toString());   
    if (columnIndex == COL_IDADE)   
        con.setIdade(aValue.toString());   
    if (columnIndex == COL_TELEFONE)   
        con.setTelefone(aValue.toString());   
}   

public Class<?> getColumnClass(int columnIndex) {   
    // Qual a classe das nossas colunas? Como estamos exibindo texto, é   
    // string.   
    return String.class;   
}   

public boolean isCellEditable(int rowIndex, int columnIndex) {   
    // Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa   
    // tabela toda é.   
    return true;   
}   

// Já que esse tableModel é de contatos, vamos fazer um get que retorne um   
// contato inteiro.   
// Isso elimina a necessidade de chamar o getValueAt() nas telas.   
public Contato get(int row) {   
    return valores.get(row);   
}   

} [/code]

Cada constante definindo as colunas deve ter um valor diferente. No seu caso, COL_TELEFONE deveria ter valor 2.

Além disso, o getColumnCount deve retornar o número de colunas da sua tabela. No seu caso são 3 e não 2.

Opa…Conseguir Listar…vlw galerinha estou Adorando TableMoel, agora vem outra Dúvida, como deletar, sendo que pra deletar eu presciso do ID, e na tabela nao está mostrando o ID??

Você deve:

  1. Pegar o índice selecionado da tabela (usando JTable.getSelectedRow() )
  2. Se esse valor for igual a -1 você não deve fazer nada (pois nenhuma linha está selecionada)
  3. Caso contrário, use esse índice para resgatar o contato do seu TableModel (ContatoTableModel.get(indice))
  4. Com o objeto Contato em mãos, chame o método de remoção da classe DAO.

certo…mas para mim chamar o ContatoTableModel eu presciso de um parametro do tipo lista de Contatos, e no deletar nao tem nescessidade(EU ACHO) de chamar uma lista e ai como faço??

Armazene uma referência ao seu TableModel. Exemplo:

// na declaração das variáveis com escopo de classe:
private ContatoTableModel model;

// um monte de código aqui.....

// na hora de instanciar a tabela:
model = new ContatoTableModel(metodoQuePreencheALista());
tabela.setModel(model);

// mais um monte de código.....

// quando precisar remover:
int index = tabela.getSelectedRow();
if (index == -1) {
    return;
}
Contato c = modelo.get(index);
seuDAO.remove(c);

Certo marcobiscaro2112,os dados foram deletados do Banco de dados perfeitamente, fiz o que vc fez, agora como eu faço para que, quando os dados forem deletados eles serem atualizados em tempo de execução??

Seu tablemodel já está criado, certo?

Então crie o método para pega-lo:

//Retorna o tablemodel associado a tabela public ContatoTableModel getModel() { return (ContatoTableModel) suaTable.getModel(); }

Aí seu método de deleção fica:

public void deletar() { int linhaSelecionada = suaTable.getSelectedRow(); if (linhaSelecionada == -1) //Nada selecionado? return; Contato c = getModel().get(linhaSelecionada); contatoDao.delete(c); getModel().delete(linhaSelecionada); }

O método de exclusão do seu TableModel seria:

[code]public void delete(int linhaSelecionada) {
contatos.remove©; //Remove da lista de contatos do model

//Avisa a tabela que a linha deve ser repintada
fireTableRowsDeleted(linhaSelecionada, linhaSelecionada);
}[/code]

Viny, estou usando ação de botao…vo postar aqui…

[code]private void bt_deletarActionPerformed(java.awt.event.ActionEvent evt) {
ContatoNegocio cont = new ContatoNegocio();
if(evt.getSource() == bt_deletar){
int row = tabela.getSelectedRow();

        if(row != -1){
            List<Contato> lista = null;
            try {
                lista = cont.listarContato();
            } catch (SQLException ex) {
                Logger.getLogger(ContatoFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
            ContatoTableModel modelo = new ContatoTableModel(lista);
            modelo.get(row);
            try {
                cont.deletarContato(row);



                JOptionPane.showMessageDialog(null,"Deletado com Sucesso");


            } catch (SQLException ex) {
                Logger.getLogger(ContatoFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
        }else {
            JOptionPane.showMessageDialog(null,"Selecione um Campo para ser Deletado");

        }
        }
}[/code]

como seria algum comando para adpatar ai dentro para deletar em tempo de execução??

Tem vários erros no seu código:

  1. Você não deve criar um novo TableModel. Você cria o TableModel uma única vez, e fica usando aquele já criado.
  2. Você não precisa listar os contatos do seu BD para deleta-los. O contato já está dentro do TableModel (tente entender o que fiz no código ali em cima).
  3. O que é ContatoNegocio? É seu DAO?

Seu método vai ficar muito mais simples do que o que vc colocou (e note que esse é muito parecido com o método deletar, que coloquei no post anterior):

[code]private void bt_deletarActionPerformed(java.awt.event.ActionEvent evt) {
int row = tabela.getSelectedRow();

if(row == -1){
JOptionPane.showMessageDialog(null,“Selecione um Campo para ser Deletado”);
return;
}

//Pega o ContatoTableModel que já está na tabela.
ContatoTableModel modelo = (ContatoTableModel) table.getModel();
Contato contato = modelo.get(row);
try {
ContatoNegocio cont = new ContatoNegocio();
cont.deletarContato(contato.getId()); //Passamos o id do contato a ser deletado.
modelo.deletar(row); //Informamos a tabela que aquele contato foi deletado (esse é o método deletar do TableModel, ali em cima)
JOptionPane.showMessageDialog(null,“Deletado com Sucesso”);
} catch (SQLException ex) {
Logger.getLogger(ContatoFrame.class.getName()).log(Level.SEVERE, null, ex);
}
} [/code]

o Classe contato négocio tem o método deletar que vai lá no DAO…vo pstar pra vc ver

public void deletarContato(int idusuario){ Contato cont = new Contato(idusuario) // Classe contato que contem o construtor que recebe id como parametro contatoDAO cDAO = new contatoDAO();//instanciando a classe DAO cDAO.deletar(cont)método DAo de deletar }
entendeu o por que do ContatoNegocio?? Eu nao estou entendendo esse seus Tres método ai, onde vou cria-los?? no Tablemodel ou na aplicação que contem a tabela??

Os dois primeiros na classe que tem a tabela (tanto que eles usam a tabela). O terceiro no seu TableModel.

Se o método de deletar recebe um idContato, pq vc estava passando para ele o row? Corrigi ali em cima.

Aquele ali emcima ta deletando certinho, a única coisa que quero, é ki a tupla seja deletada da Jtable em tempo de execução, os dados estão sendo deletados do Banco de Dados perfeitamente com o código que postei acima, só quero saber como eu faço para sujir com a tupla deletada em tempo de execução…

[quote=ViniGodoy]Tem vários erros no seu código:

  1. Você não deve criar um novo TableModel. Você cria o TableModel uma única vez, e fica usando aquele já criado.
  2. Você não precisa listar os contatos do seu BD para deleta-los. O contato já está dentro do TableModel (tente entender o que fiz no código ali em cima).
  3. O que é ContatoNegocio? É seu DAO?

Seu método vai ficar muito mais simples do que o que vc colocou (e note que esse é muito parecido com o método deletar, que coloquei no post anterior):

[code]private void bt_deletarActionPerformed(java.awt.event.ActionEvent evt) {
int row = tabela.getSelectedRow();

if(row == -1){
JOptionPane.showMessageDialog(null,“Selecione um Campo para ser Deletado”);
return;
}

//Pega o ContatoTableModel que já está na tabela.
ContatoTableModel modelo = (ContatoTableModel) table.getModel();
Contato contato = modelo.get(row);
try {
ContatoNegocio cont = new ContatoNegocio();
cont.deletarContato(contato.getId()); //Passamos o id do contato a ser deletado.
modelo.deletar(row); //Informamos a tabela que aquele contato foi deletado (esse é o método deletar do TableModel, ali em cima)
JOptionPane.showMessageDialog(null,“Deletado com Sucesso”);
} catch (SQLException ex) {
Logger.getLogger(ContatoFrame.class.getName()).log(Level.SEVERE, null, ex);
}
} [/code][/quote]
Que contato é esse Contato contato = modelo.get(row);

Ué, o seu TableModel não tem uma lista de contatos dentro? Você está pedindo para o modelo o contato que está na linha que foi selecionada no JTable.

entao quer dizer que esse contato Contato contato = modelo.get(row);
é aquele contato que declarei na TableModel?? esse -->>private List<Contato> Contato // ESSE CÓDIO ESTÁ DENTRO DA TABLE MODEL

Vlw viny, deu certinho cara obrigado, só prescisei implementar o método de deletar dentro da TableModel…
vlw cara…

Viu… foi assim tão dificil?