Como listar dados dentro da Jtable utilizando um TableModel que criei? =)
20 respostas
A
Anderson_S
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;
}
importjava.util.ArrayList;importjava.util.List;importjavax.swing.table.AbstractTableModel;publicclassContatoTableModelextendsAbstractTableModel{privatestaticfinalintCOL_NOME=0;privatestaticfinalintCOL_IDADE=1;privatestaticfinalintCOL_TELEFONE=1;privateList<Contato>valores;// Esse é um construtor, que recebe a nossa lista de livros publicContatoTableModel(List<Contato>valores){this.valores=newArrayList<Contato>(valores);}publicintgetRowCount(){// Quantas linhas tem sua tabela? Uma para cada item da lista. returnvalores.size();}publicintgetColumnCount(){// Quantas colunas tem a tabela? Nesse exemplo, só 2. return2;}publicStringgetColumnName(intcolumnIdx){// 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 }publicObjectgetValueAt(introw,intcolumn){// Precisamos retornar o valor da coluna column e da linha row. Contatocon=valores.get(row);if(column==COL_NOME)returncon.getNome();if(column==COL_IDADE)returncon.getIdade();if(column==COL_TELEFONE)returncon.getTelefone();return"";// Nunca deve ocorrer }publicvoidsetValueAt(ObjectaValue,introwIndex,intcolumnIndex){// 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ó. Contatocon=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());}publicClass<?>getColumnClass(intcolumnIndex){// Qual a classe das nossas colunas? Como estamos exibindo texto, é // string. returnString.class;}publicbooleanisCellEditable(introwIndex,intcolumnIndex){// Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa // tabela toda é. returntrue;}// 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. publicContatoget(introw){returnvalores.get(row);}}
M
marcobiscaro2112
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
Anderson_S
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
marcobiscaro2112
Você deve:
Pegar o índice selecionado da tabela (usando JTable.getSelectedRow() )
Se esse valor for igual a -1 você não deve fazer nada (pois nenhuma linha está selecionada)
Caso contrário, use esse índice para resgatar o contato do seu TableModel (ContatoTableModel.get(indice))
Com o objeto Contato em mãos, chame o método de remoção da classe DAO.
A
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??
M
marcobiscaro2112
Armazene uma referência ao seu TableModel. Exemplo:
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
ViniGodoy
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 tabelapublicContatoTableModelgetModel(){return(ContatoTableModel)suaTable.getModel();}
publicvoiddelete(intlinhaSelecionada){
contatos.remove(c); //Remove da lista de contatos do model//AvisaatabelaquealinhadeveserrepintadafireTableRowsDeleted(linhaSelecionada,linhaSelecionada);
}
A
Anderson_S
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
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);
}
}
A
Anderson_S
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
ViniGodoy
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
Anderson_S
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
Anderson_S
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
ViniGodoy
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
Anderson_S
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
Anderson_S
Vlw viny, deu certinho cara obrigado, só prescisei implementar o método de deletar dentro da TableModel…
vlw cara…
M
Marky.Vasconcelos
Viu… foi assim tão dificil?
V
ViniGodoy
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: