[RESOLVIDO] Problemas com cadastro feito em tempo de execução...( TableModel )

Oi,

Então o erro não está no insert e nem no select da pesquisa. e Sim quando você está carregando a tabela.

Post o código que você faz para carregar a tabela.

Tchauzin!

Anderson, posta o seu Model e a classe que o manipula aí.

Boa tarde Lina e Ironlynx … Vo postar o método que utilizo para listar na JTable e minha TableModel…
qualquer código que vocês quiserem é só falar que posto…
Obrigado pela ajuda!!! :smiley:

MÉTODO QUE PREENCHE A JTABLE

[code]private void preencheTabela() throws SQLException{

    ContatoNegocio cont = new ContatoNegocio();
    List<Contato> lista = cont.listarContato();

    ContatoTableModel modelo = new ContatoTableModel(lista);
   
    tabela.setModel(modelo);
}[/code]

MINHA TABLEMODEL

[code]package Apresentacao;

import Negocio.Contato;
import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

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

private List<Contato> Contato;

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

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

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

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

public Object getValueAt(int row, int column) {
    // Precisamos retornar o valor da coluna column e da linha row.
    Contato con = Contato.get(row);
    if (column == COL_ID)
        return con.getIdusuario();
    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 = Contato.get(rowIndex);
     if (columnIndex == COL_ID)
        con.setIdusuario(aValue.toString().indexOf(COL_ID));
    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;
}
public void delete(int row){
    Contato.remove(row);
    fireTableRowsDeleted(row,row);

}
public void add(Contato c){
    Contato.add(c);//adiciona o novo contato no modelo
    fireTableDataChanged();
}



// 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 Contato.get(row);
}

}
[/code]

Posta o código de

ContatoNegocio.listarContato();

Erro sinistro esse seu ein.

[quote=Mark_Ameba]Posta o código de

ContatoNegocio.listarContato();

Erro sinistro esse seu ein.[/quote]
Pois, é eu também to achando… :mrgreen:
TA AI O MÉTODO

[code]public List listarContato() throws SQLException{

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

Ta entao posta contatoDAO.listar()

[b]Ta ai…

ContatoDAO.Listar()[/b]

[code]public List listar() throws SQLException{ // MÉTODO UTILIZADO PARA BUSCAR OS DADOS DO BANCO E LISTAR DO JTABLE

    Connection conn = Conexao.getConexao();   

    String sql = "Select * from usuario order by nome";   
    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]

Ta bem Sinistro esse problema viu!!! :?

Oi,

Acho que o erro está aqui.:

[code]
public List listar() throws SQLException{ // MÉTODO UTILIZADO PARA BUSCAR OS DADOS DO BANCO E LISTAR DO JTABLE

    while(rs.next()) {   
       
        Contato contato = new Contato(rs.getInt("idusuario"));   // ESSA LINHA.... IDUSUARIO deveria ter um setId(); ?!?!?! Ao menos que você faça isso no contrutor de Contato()
                    contato.setNome(rs.getString("nome"));   
                    contato.setIdade(rs.getString("idade"));   
                    contato.setTelefone(rs.getString("telefone"));   
       
        minhaLista.add(contato);   

}[/code]

por questão de agilidade, quando fizer um.:

String sql = "Select * from usuario order by nome";

Especifique somente como retorno as colunas que gostaria de trazer do banco, ou seja:

String sql = "Select idusuario, nome, idade, telefone from usuario order by nome";

Tchauzin!

Lina nesta linha aqui Contato contato = new Contato(rs.getInt("idusuario")Eu tenho um construtuor na classe contato que recebe o idusuario como parametro, por isso coloquei assim!!!
Mesmo assim Obrigado!!

Cara vai no seu banco e coloca a SQL que voce quer que obtenha só o id e ve se funciona.

PS: Foto meiga lina ;*

[quote=Mark_Ameba]Cara vai no seu banco e coloca a SQL que voce quer que obtenha só o id e ve se funciona.

PS: Foto meiga lina ;*[/quote]
Minha intenção não é obter o id, e sim que ele aparece em tempo de execução na JTable, e todo tipo de consulta que você pensar eu ja fiz no SQL, lá da certo concerteza, mas na JTable não aparece…Mark_Ameba, ja fiz Trigger,Ponteiro,Function e etc. Meu professor de Banco de Dados me ajudou a fazer, mesmo assim continua vindo com ID igual a zero, é o erro mais Sinistro que ja vi na minha vida… :twisted:

[quote]
Minha intenção não é obter o id, e sim que ele aparece em tempo de execução na JTable, e todo tipo de consulta que você pensar eu ja fiz no SQL, lá da certo concerteza, mas na JTable não aparece…Mark_Ameba, ja fiz Trigger,Ponteiro,Function e etc. Meu professor de Banco de Dados me ajudou a fazer, mesmo assim continua vindo com ID igual a zero, é o erro mais Sinistro que ja vi na minha vida… :twisted:[/quote]

Oi,

Coloque a sua classe contato, por favor…

[quote=Mark_Ameba]Cara vai no seu banco e coloca a SQL que voce quer que obtenha só o id e ve se funciona.

PS: Foto meiga lina ;*[/quote]

É… rs

Tchauzin!

Cara… esse erro é muito sinistro.

Não sei por que voce insiste em não pesquisar.
Voce quer que seu objeto adivinhe seu ID ou que ele pesquise no banco qual é o ID respectivo a ele?

[quote=Mark_Ameba]Cara… esse erro é muito sinistro.

Não sei por que voce insiste em não pesquisar.
Voce quer que seu objeto adivinhe seu ID ou que ele pesquise no banco qual é o ID respectivo a ele?[/quote]
Não estou entendendo o que você quer dizer??
passe sua teoria para código…

[quote=lina][quote]
Minha intenção não é obter o id, e sim que ele aparece em tempo de execução na JTable, e todo tipo de consulta que você pensar eu ja fiz no SQL, lá da certo concerteza, mas na JTable não aparece…Mark_Ameba, ja fiz Trigger,Ponteiro,Function e etc. Meu professor de Banco de Dados me ajudou a fazer, mesmo assim continua vindo com ID igual a zero, é o erro mais Sinistro que ja vi na minha vida… :twisted:[/quote]

Oi,

Coloque a sua classe contato, por favor…

[quote=Mark_Ameba]Cara vai no seu banco e coloca a SQL que voce quer que obtenha só o id e ve se funciona.

PS: Foto meiga lina ;*[/quote]

É… rs
Tchauzin![/quote]

Ta ai a classe Contato, mas acho que ela não tem nada a ver com o erro!!!

[code]package Negocio;

public class Contato {

private int idusuario;
private String nome;
private String idade;
private String telefone;

//Contrutor utilizado para Update e delete
public Contato( int idusuario){

  this.idusuario = idusuario;
}

// Contrutor padrão
public Contato(String nome , String idade , String telefone){

	this.nome = nome;
	this.idade = idade;
	this.telefone = telefone;
}
    //Construtor utilizado especialmente para busca
    public Contato(String nome){
        this.nome = nome;
    }



public String getNome() {
	return nome;
}
public void setNome(String nome) {
	this.nome = nome;
}
public String getIdade() {
	return idade;
}
public void setIdade(String idade) {
	this.idade = idade;
}
public String getTelefone() {
	return telefone;
}
public void setTelefone(String telefone) {
	this.telefone = telefone;
}

public int getIdusuario() {
	return idusuario;
}

public void setIdusuario(int idusuario) {
	this.idusuario = idusuario;
}

}
[/code]

Boa tarde Galera… Até que enfim conseguir resolver esse problema Sinistro, de uma maneira bem fácil e Inteligente :)…
fiz o seguinte.:
Eu criei um metodo dentro do DAO para buscar no Banco de Dados logo após a inseção o id referente ao nome digitado dentro do TextFild na tela de cadastro…

ESSE MÉTODO AQUI…

[code] //Método criado para buscar o Id do usuario, para que ele possa aparecer
//em tempo de execução naJTable… =]
public int buscaID(String nome) throws SQLException{

     Connection conn = Conexao.getConexao();
     Contato contato = new Contato(nome);

     String val = "Select idusuario from usuario where nome = ?";
     PreparedStatement stmt = conn.prepareStatement(val);
     stmt.setString(1, contato.getNome());
     ResultSet rs = stmt.executeQuery();
     while(rs.next()){

                  contato.setIdusuario(rs.getInt("idusuario"));
                   num = contato.getIdusuario();
            }
         stmt.close();
         rs.close();
         return num;

}[/code]

depois antes de passar o contato para o TableModel eu chamei o método após a inserção e passei o valor do TextFild pra ele…
ESSA PÁRTE DO CÓDIGO AQUI…

[code]…

     Contato contato = new Contato(tf_nome.getText() , tf_idade.getText() , tf_telefone.getText());
        try {
            
            cont.cadastrarContato(contato.getNome(),contato.getIdade(),contato.getTelefone());
            int num = dao.buscaID(contato.getNome());// CHAMANDO O MÉTODO DE buscarID DO DAO


[/code]

depois setei esse valor dentro do Contato, logo após setei o contato no modelo…
ESSA PARTE DO CÓDIGO AQUI

........................................................... contato.setIdusuario(num); modelo.add(contato); ...........................................................
O botão cadastrar por completo fica assim, sem corta partes de código para explicação…

[code]private void bt_cadastrarActionPerformed(java.awt.event.ActionEvent evt) {

    if((evt.getSource() == bt_cadastrar) && (verificarDados())){
        ContatoNegocio cont = new ContatoNegocio();
        ContatoTableModel modelo = (ContatoTableModel)tabela.getModel();
        contatoDAO dao = new contatoDAO();
        
        // Contato Criado para utilizar no tablemodel, para que ele
        // possa indentificar o novo contato
        Contato contato = new Contato(tf_nome.getText() , tf_idade.getText() , tf_telefone.getText());
        try {
            
            cont.cadastrarContato(contato.getNome(),contato.getIdade(),contato.getTelefone());
            int num = dao.buscaID(contato.getNome());
            contato.setIdusuario(num);
            modelo.add(contato);
           
            
            
        } catch (SQLException ex) {
            Logger.getLogger(ContatoFrame.class.getName()).log(Level.SEVERE, null, ex);
        }
        JOptionPane.showMessageDialog(null,"Cadastrado Com Sucesso!!!");
        limparCampos();
            
        
    }
} [/code]

Agora sempre que cadastro, o ID do mesmo aparece em tempo de execução na JTable…
Muito obrigado mais uma vez a todos vocês por terem me ajudar a solucionar mais um Problema!! Abraço… :mrgreen:

Oi,

A diferença é que agora você utiliza o método setIdUsuario() e anteriormente apenas passava o mesmo no construtor e adicionando a classe contato.

Parabéns! Não tinha pensado dessa forma :wink:

Obs.: Edit seu primeiro post e coloque a tag [RESOLVID] no inicio ou no final. ok?

Tchauzin!

Orra… problema dificil esse.

E no final das contas voce fez exatamente o que eu te falava desde o outro tópico.

Parabéns.