Dúvida na consulta de um registro no banco de dados e exibir na jTable [RESOLVIDO]

6 respostas
S

Pessoal, eu estou tentando fazer uma consulta de um registro no banco de dados (MySQL) pra exibir na grid da jTable e não estou conseguindo. Esse programa é um cadastro de clientes. Eu já consegui conectar no banco e exibir os dados cadastrados no banco na jTable. Vou mostrar um print da tela do programa pra vocês terem uma base melhor.

Essa é a tela de visualização da grid com os dados do banco:
[img]http://img4.imageshack.us/img4/9/tela01k.jpg[/img]

E essa é a tela de cadastro/alteração:
[img]http://img182.imageshack.us/img182/8307/tela02.jpg[/img]

Quando eu gravo os dados no banco, ele já exibe os dados na grid normalmente logo quando eu executo o programa. Mas quando eu digito um nome no campo de busca e clico em "Consultar", ele não mostra nada na grid, a tela continua do jeito que estava com todos os dados do banco.

Vou mostrar o código pra vocês então. Esse código eu coloquei dentro de um Evento do botão Consultar pra quando eu digitasse a palavra e clicasse em Consultar, ele mostrar o resultado.. Esse é o mesmo código que eu coloquei em outra parte da classe pra exibir os dados na grid sem fazer a consulta. Eu só mudei o Select. Vejam o código:

try{
						
						
						String nomeConsulta = jTextFieldNomeConsulta.getText();
						
						st = conexao.conectar().createStatement();
						
						sql = "select * from cliente where Nome like '"+ "%" + nomeConsulta + "%" + "'";
						
						

						rs = st.executeQuery(sql);
						rs.last();
						linhas = rs.getRow();
						dados = new String[linhas][4];
						rs.first();
						int lin = 0;
						
						while(rs.next()){
							dados [lin][0] = rs.getString(2);
							dados [lin][1] = rs.getString(4);
							dados [lin][2] = rs.getString(6);
							dados [lin][3] = rs.getString(10);
							
System.out.println("teste");
												
							lin++;
							
						}
						st.close();
						
				}catch (Exception ex){
					System.out.println("erro"+ex);
				}
				
				tm = new AbstractTableModel(){
					public int getColumnCount(){
						
						return 4;
					}
					
					public int getRowCount(){
						return linhas;
					}
					
					public String getColumnName (int ci){
						
						if (ci == 0) return "Nome";
						if (ci == 1) return "Sexo";
						if (ci == 2) return "Idade";
						if (ci == 3) return "Endereço";
						return "";
					}
					
					public Object getValueAt (int ri, int ci){
						return dados [ri][ci];
					}
			}

O ResultSet, Statement, o array dados, e as variáveis "linhas" e "sql" já estão declarados no começo da classe. E essa linha: System.out.println("teste"); é pra testar se estava entrando no while mesmo e imprimindo o teste e está imprimindo normal.

Eu não sei programar no padrão MVC tudo separado por pacotes como to, dao, gui, por isso tudo fica na mesma classe.

E então, vocês podem me dar uma ajuda nesse código? Vou ficar no aguardo, obrigado.

6 Respostas

S

E aí pessoal, alguém pode me ajudar?

Marky.Vasconcelos

Pelo o que vi voce apenas criou o TableModel novo. Mas voce setou ele para a tabela novamente?

G
Cara bem olha isso tira uma base, isso eu estou fazendo apenas o codigo da tabela.
public class UsuarioModel extends AbstractTableModel{
    private String [] colunas = {"NOME","ID"};
    ArrayList<Usuario> colecao = new ArrayList<Usuario>();
    UsuarioDao dao = new UsuarioDao();

    public UsuarioModel()
    {
        try {
            colecao = dao.listar();
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioModel.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(UsuarioModel.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

     //conta quantas linhas vai ter
    public int getRowCount() {
        return colecao.size();
    }
    //conta o tamanho das colunas
    public int getColumnCount() {
        return colunas.length;
    }
    //joga o nome da coluna
    @Override
    public String getColumnName(int column) {
        return colunas[column];
    }

    //Joga os valores que tem q ter em cada coluna
    public Object getValueAt(int rowIndex, int columnIndex) {
        Usuario p =  colecao.get(rowIndex);
         if(columnIndex == 0)
        {
            return p.getNome();
        }
         else
        {
            return p.getId();
        }
    }
    //lista o banco de dados
    public void listar()
    {
        try {
            colecao = dao.listar();
            fireTableDataChanged();
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioModel.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(UsuarioModel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Usuario getUsuario(int index)
    {   Usuario u = colecao.get(index);
        return u;
    }
}
S

Então, isso que eu pensei aqui, o atributo do TableModel é o tm e esse é o mesmo que eu uso na outra tabela assim: jTable = new JTable™; Eu teria que ter um novo jTable e um novo atributo do TableModel pra usar um em cada situação? Pelo que eu entendi então, eu estava querendo usar um tm que já estava sendo usado pela outra tabela. É isso?

Marky.Vasconcelos

Nao… mas imagina o seguinte caso.

String x = "10";
Integer i = Integer.parseInt(x);//i vale 10

Se eu mudar "x = “15"” depois de convertelo para um numero o inteiro i vai valer 15 ou 10?
10!

Isso por que voce alterando a referencia voce nao altera todas referencias ao objeto.

Voce nao precisa criar uma Jtable nova, só setar o TableModel novamente.

tm = new AbstractTableModel(){  //... };
jTable.setModel(tm);
S

Mark_Ameba:
Nao… mas imagina o seguinte caso.

String x = "10";
Integer i = Integer.parseInt(x);//i vale 10

Se eu mudar "x = “15"” depois de convertelo para um numero o inteiro i vai valer 15 ou 10?
10!

Isso por que voce alterando a referencia voce nao altera todas referencias ao objeto.

Voce nao precisa criar uma Jtable nova, só setar o TableModel novamente.

tm = new AbstractTableModel(){ //... }; jTable.setModel(tm);

hum sim entendi. Eu já resolvi o problema, tem um amigo meu que me ajudou. Era mais ou menos isso mesmo, de setar uma nova instância apenas pra tabela, mas teve que fazer classes separadas pra ficar melhor.

Até mais, valeu.

Criado 12 de setembro de 2009
Ultima resposta 16 de set. de 2009
Respostas 6
Participantes 3