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

20 respostas
A
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
public List<Contato> 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;
      }
MÉTODO LISTAR DA REGRA DE NEGÓCIO
public List<Contato> listarContato() throws SQLException{

		contatoDAO cDAO = new contatoDAO();
	        return cDAO.listar();
	}
vle galerinha..(vlw Viny e Mark_Ameba)

20 Respostas

M

Cade seu TableModel?

A
Mark_Ameba:
Cade seu TableModel?
TA AQUI..
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);   
    }   
}
M

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.

A

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??

M

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.
A

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??

M

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

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??

V
Anderson S.:
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??

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:

public void delete(int linhaSelecionada) {
   contatos.remove(c); //Remove da lista de contatos do model

   //Avisa a tabela que a linha deve ser repintada
   fireTableRowsDeleted(linhaSelecionada, linhaSelecionada); 
}
A
Viny, estou usando ação de botao...vo postar aqui..
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");

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

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):

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);  
   }  
}
A

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??

V

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.

A

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…

A
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):

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);  
   }  
}
Que contato é esse
Contato contato = modelo.get(row);
V

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.

A

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

A

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

M

Viu… foi assim tão dificil?

V

Ok, agora procura entender o que aconteceu aí.

Aquele método "getModel()" é para evitar fazer:

ContatoTableModel model = (ContatoTableModel) tabela.getModel()

toda hora. Como vc vai precisar fazer isso várias vezes, faça apenas um único método assim:

public ContatoTableModel getModel() {
   return (ContatoTableModel) tabela.getModel();
}
E aí use nos demais métodos, como o do botão:
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;  
   }  
   
   Contato contato = getModel().get(row); //Viu, muito mais prático. :)
   try {    
      ContatoNegocio cont = new ContatoNegocio();  
      cont.deletarContato(contato.getId());   
      getModel().deletar(row); //Olha o getModel aqui de novo. :D
      JOptionPane.showMessageDialog(null,"Deletado com Sucesso");    
   } catch (SQLException ex) {    
      Logger.getLogger(ContatoFrame.class.getName()).log(Level.SEVERE, null, ex);    
   }    
}
Criado 12 de março de 2010
Ultima resposta 12 de mar. de 2010
Respostas 20
Participantes 4