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)
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??
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:
- Você não deve criar um novo TableModel. Você cria o TableModel uma única vez, e fica usando aquele já criado.
- 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).
- 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:
- Você não deve criar um novo TableModel. Você cria o TableModel uma única vez, e fica usando aquele já criado.
- 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).
- 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?