Pesquisa em jTable

32 respostas
M

Olá galera, estou tento alguns problemas em relação a utilização da jTable. Estou finalizando um projeto de uma agenda de contatos e resolvi colocar na tela onde mostra a jTable com os dados cadastrados no banco de dados um jTextField e um botão para fazer a pesquisa. O problema é que da forma que fiz, está acontecendo a pesquisa, mas não da forma correta, ou seja, se eu digitar no campo pesquisa a Letra M, deveria ser listado todos os contatos iniciados com a letra M, o que não acontece. Estão sendo listados apenas 2 registros, de forma que, deveria ser listados 5, pois é o total de registros cadastrados no banco iniciados com essa letra. Além disso, se for digitado o nome Marcelo, por exemplo, a pesquisa não acha. Sinceramente eu não sei onde estou errando. Abaixo está o código que estou utilizando na aplicação. Alguém pode me ajudar ?

Método para a pesquisa

public void pesqRegistro(String value) {

ResultSets = new ArrayList<String[ ]>( );
    

    JTextField[ ] tf= campos(    ); // não precisa

    String SQL="SELECT registro,nome,telefone FROM registros WHERE nome LIKE ' " + value + "%' " ;

    ResultSet res;

    try{
        res=stmt.executeQuery(SQL);
        while(res.next( ) ){
        String[ ] row = {res.getString("registro"),res.getString("nome"),res.getString("telefone")};
        ResultSets.add(row);
        
        tabela.setResult(res);
                    
       }
                  
        tabela.fireTableStructureChanged();

       }catch(SQLException ex){
        ex.printStackTrace();

      }

}


Evento do botão pesquisar

private void jbutaoPesqActionPerformed(java.awt.event.ActionEvent evt) {

// TODO add your handling code here:

   pesqRegistro( tfPesq.getText( ) );
}

32 Respostas

ViniGodoy

Essa linha deveria estar fora do while:

Espero que você não esteja usando o DefaultTableModel. E seria uma boa você usar o PreparedStatement e evitar aquela concatenação de Strings perigosa ali.

Além disso, ao postar códigos, siga essa dicas:
http://www.guj.com.br/posts/list/50115.java

M

Não estou usando defaultTableModel, criei um TableModel. Em relação tabela.setResult(res) já testei fora do enquanto e continua dando o mesmo resultado.
Fiz um teste simples para ver se a pesquisa está retornando os valores corretamente, por exemplo criei um contador para retornar o número de registros em cada pesquisa e deu certo. O problema está em relação a visualização dos dados dessa pesquisa na jTable. Parece que ela não está conseguindo montar a visualização desses dados, o que posso fazer.

ViniGodoy

Ainda estou esperando vc postar a dúvida que vc me enviou na MP aqui, para que continuemos a evoluir esse tópico.

M

Em relação ao código postado anteriormente, fiz algumas modificações para tentar conseguir visualizar os dados da pesquisa do banco de dados na jTable e não consegui. Para o projeto agenda, criei o próprio modelo de tabela - TableModel, nesse caso chamado de TabelaAgenda e também criei uma Lista, um método para mostrar os dados da pesquisa na JTable e nada. Tem uma variável tabela que é do tipo TabelaAgenda, onde faço com que ela receba os dados da Lista para ser visualizadas na jTable, mas não funciona.
Fiz um teste para ver se a consulta estava retornando corretamente os resultados da pesquisa que viram do banco, só que para serem mostrados no console e tudo funcionou corretamente. O problema está em mostrar esses dados na jTable. Segue abaixo o meu modelo (TabelaAgenda) e os códigos para que os dados sejam mostrados na jTable.

TabelaAgenda:

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author marcelo
 */
public class TabelaAgenda extends AbstractTableModel {
    private int rownum;
    private static final String[] colNames={"Registro","Nome","Telefone"};
    private ArrayList<String[]>ResultSets;
    private ResultSetMetaData metaData;
    private Statement stmt;

    
    public TabelaAgenda(ResultSet rs)throws SQLException {
        setResult(rs);
       
    }



    public int getRowCount() {
        return ResultSets.size();
    }

    public int getColumnCount() {
        return colNames.length;
    }
    public String getColumnName(int param){
        return colNames[param];
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        String[]row = ResultSets.get(rowIndex);
        return row[columnIndex];
    }

    public void setResult(ResultSet rs) throws SQLException {
        ResultSets=new ArrayList<String[]>();

        while (rs.next()){
            String[]row = {rs.getString("registro"),rs.getString("nome"),rs.getString("Telefone")};
            ResultSets.add(row);
        }
        fireTableStructureChanged();
       

    }

    public void deletRow(int row){
        ResultSets.remove(row);
        fireTableRowsDeleted(row,row);

    }

   }

Classe Agenda: Nessa classe ficam todos os métodos de acesso ao banco de dados

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 *
 * @author marcelo
 */
public class Agenda extends javax.swing.JFrame {

    private TabelaAgenda tabela;
    private Statement stmt;
    private Conexao conexao;
    private Connection conn;
    private String rowId;
    private boolean novo;
    private Object tamanhoFrame;
    private ArrayList<String[]> ResultSets;
    private String value;
    private Connection con;
    List<Contatos> contato;
    
   
    
      private ResultSet getResults(){
        ResultSet rs =null;
        try{
            rs=stmt.executeQuery("select*from registros ORDER BY registro");
        }catch(SQLException e){}
        return rs;
    }

    public List<Contatos> getList(String nome) throws SQLException{
        String sql ="SELECT registro,nome,telefone FROM registros WHERE nome LIKE ?";
        PreparedStatement stm = conn.prepareStatement(sql);
        stm.setString(1,nome);
        ResultSet rs = stm.executeQuery();

        List<Contatos> minhaLista = new ArrayList<Contatos>();

        while(rs.next()){
            Contatos tab = new Contatos();
            tab.setRegistro(Long.valueOf(rs.getString("registro")));
            tab.setNome(rs.getString("nome"));
            tab.setTelefone(rs.getString("telefone"));
            minhaLista.add(tab);

          
        }
        rs.close();
        stm.close();
        return minhaLista;
   
    }

    private void listarContatos() throws SQLException {
        Agenda agend =new Agenda();
        contato=agend.getList(tfPesq.getText() + "%");
        mostrarPesquisa(contato);

    }

    private void mostrarPesquisa(List<Contatos> contato) throws SQLException {
        if(contato.size() == 0){
          JOptionPane.showMessageDialog(null, "Dado não encontrado na pesquisa");
        }else{
            String [] linha = new String[]{null,null,null};
            for(int i=0;i< contato.size();i++){

          // tabela.addTableModelListener(jTable1);
            tabela.setValueAt(contato.get(i).getRegistro(),i, 0);
            tabela.setValueAt(contato.get(i).getNome(),i, 1);
            tabela.setValueAt(contato.get(i).getTelefone(),i, 2);
        }
            tabela.fireTableDataChanged();
    }

  }
        
}

Também criei a classe contatos que possui tos os métos set e get. O método mostrarPesquisa foi criado para setar os valores da pesquisa na jtable. Tentei fazer dessa forma, baseado em um método para defaultTableModel, mas não deu certo, apesar de a variável tabela representar a TabelaAgenda. Contudo, a jtable ñão consegue receber esses novos dados. Até agora ninguém, inclusive eu, consegui descobrir o que está acontencendo.
No evento do botão pesquisar chamo o método listarContatos.

ViniGodoy

Se você criou a classe contato, está na hora de usa-la. Primeiro vamos organizar seu sistema, depois vemos a questão do TableModel.

A primeira coisa que você tem que fazer, é criar a classe de contato. Isso, você comentou que já fez.
Em seguida, você precisa criar uma classe que carregue contatos do banco. Normalmente é uma classe separada, chamada ContatoDao. Ela vai ter um método assim:

public List&lt;Contato&gt; carregarContatos() { //Coloque aqui a query para o banco }

Outras versões, como carregarContatoPorNome(String nome), também podem existir no DAO.

Com a lista de contatos na mão, aí sim, chega a hora de montar seu TableModel. Dentro do TableModel, você terá um List<Contato> e não um ArrayList<String[]>. Seu tablemodel já estava no caminho certo, mas vc deve usar sempre classes de negócio e não String[].

M

O método que carrega contatos do banco, também já foi criado, no caso:

public List<Contatos> getList(String nome) throws SQLException{   
        String sql ="SELECT registro,nome,telefone FROM registros WHERE nome LIKE ?";   
        PreparedStatement stm = conn.prepareStatement(sql);   
        stm.setString(1,nome);   
        ResultSet rs = stm.executeQuery();   
  
        List<Contatos> minhaLista = new ArrayList<Contatos>();   
  
        while(rs.next()){   
            Contatos tab = new Contatos();   
            tab.setRegistro(Long.valueOf(rs.getString("registro")));   
            tab.setNome(rs.getString("nome"));   
            tab.setTelefone(rs.getString("telefone"));   
            minhaLista.add(tab);   
  
             
        }   
        rs.close();   
        stm.close();   
        return minhaLista;   
     
    }

E esse metodo está na classe Agenda que possui todos os métodos para inserção,atualização, exclusão e pesquisa no banco de dados, como se fosse o ContatoDao que vc está falando. No caso, eu terei que substituir essa lista criada acima? se eu utilizá-la e criar uma outra dentro do meu TableModel(TabelaAgenda) funcionará ?

ViniGodoy

Dê uma olhada agora na classe do Erik Yuzo (a primeira da minha assinatura). Apenas mudei o original dele que era "Socio" para "Contato":

import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 * Implementação de Table Model para exibir os Sócios.
 * 
 * @author Eric Yuzo
 */
public class ContatoTableModel extends AbstractTableModel {

	private static final long serialVersionUID = 1L;

	/* Lista de Sócios que representam as linhas. */
	private List&lt;Contato&gt; linhas;

	/* Array de Strings com o nome das colunas. */
	private String[] colunas = new String[] {
			"Nome", "E-mail", "Telefone fixo", "Telefone celular"};


	/* Cria um ContatoTableModel vazio. */
	public ContatoTableModel() {
		linhas = new ArrayList&lt;Contato&gt;();
	}

	/* Cria um ContatoTableModel carregado com
	 * a lista de sócios especificada. */
	public ContatoTableModel(List&lt;Contato&gt; listaDeContatos) {
		linhas = new ArrayList&lt;Contato&gt;(listaDeContatos);
	}


	/* Retorna a quantidade de colunas. */
	@Override
	public int getColumnCount() {
		// Está retornando o tamanho do array &quot;colunas&quot;.
		// Mas como o array é fixo, vai sempre retornar 4.
		return colunas.length;
	}

	/* Retorna a quantidade de linhas. */
	@Override
	public int getRowCount() {
		// Retorna o tamanho da lista de sócios.
		return linhas.size();
	}

	/* Retorna o nome da coluna no índice especificado.
	 * Este método é usado pela JTable para saber o texto do cabeçalho. */
	@Override
	public String getColumnName(int columnIndex) {
		// Retorna o conteúdo do Array que possui o nome das colunas
		// no índice especificado.
		return colunas[columnIndex];
	};

	/* Retorna a classe dos elementos da coluna especificada.
	 * Este método é usado pela JTable na hora de definir o editor da célula.
	 * Como todos os campos deste model são Strings (nome, e-mail e fones),
	 * o retorno será sempre a classe String. */
	@Override
	public Class&lt;?&gt; getColumnClass(int columnIndex) {
		return String.class;
	};

	/* Retorna o valor da célula especificada
	 * pelos índices da linha e da coluna. */
	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		// Pega o sócio da linha especificada.
		Contato contato = linhas.get(rowIndex);

		// Retorna o campo referente a coluna especificada.
		// Aqui é feito um switch para verificar qual é a coluna
		// e retornar o campo adequado. As colunas são as mesmas
		// que foram especificadas no array &quot;colunas&quot;.
		switch (columnIndex) {
		case 0: // Primeira coluna é o nome.
			return contato.getNome();
		case 1: // Segunda coluna é o e-mail.
			return contato.getEmail();
		case 2: // Terceira coluna é o telefone fixo.
			return contato.getTelefoneFixo();
		case 3: // Quarta coluna é o telefone celular.
			return contato.getTelefoneCelular();
		default:
			// Se o índice da coluna não for válido, lança um
			// IndexOutOfBoundsException (Exceção de índice fora dos limites).
			// Não foi necessário verificar se o índice da linha é inválido,
			// pois o próprio ArrayList lança a exceção caso seja inválido.
			throw new IndexOutOfBoundsException(&quot;columnIndex out of bounds&quot;);
		}
	}

	/* Seta o valor da célula especificada
	 * pelos índices da linha e da coluna.
	 * Aqui ele está implementado para não fazer nada,
	 * até porque este table model não é editável. */
	public void setValueAt(Object aValue, int rowIndex, int columnIndex) {};

	/* Retorna um valor booleano que define se a célula em questão
	 * pode ser editada ou não.
	 * Este método é utilizado pela JTable na hora de definir o editor da célula.
	 * Neste caso, estará sempre retornando false, não permitindo que nenhuma
	 * célula seja editada. */
	@Override
	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}


	////////////////////////////////////////////////////////////
	// Os métodos declarados até aqui foram as implementações //
	// de TableModel, que são continuamente utilizados        //
	// pela JTable para definir seu comportamento,            //
	// por isso o nome Table Model (Modelo da Tabela).        //
	//													      //
	// A partir de agora, os métodos criados serão            //
	// particulares desta classe. Eles serão úteis            //
	// em algumas situações.							      //
	////////////////////////////////////////////////////////////


	/* Retorna o sócio da linha especificada. */
	public void getContato(int indiceLinha) {
		linhas.get(indiceLinha);
	}
	
	/* Adiciona um registro. */
	public void addContato(Contato contato) {
		// Adiciona o registro.
		linhas.add(contato);

		// Pega a quantidade de registros e subtrai um para achar
		// o último índice. É preciso subtrair um, pois os índices
		// começam pelo zero.
		int ultimoIndice = getRowCount() - 1;

		// Reporta a mudança. O JTable recebe a notificação
		// e se redesenha permitindo que visualizemos a atualização.
		fireTableRowsInserted(ultimoIndice, ultimoIndice);
	}

	/* Remove a linha especificada. */
	public void removeContato(int indiceLinha) {
		// Remove o sócio da linha especificada.    	
		linhas.remove(indiceLinha);

		// Reporta a mudança. O JTable recebe a notificação
		// e se redesenha permitindo que visualizemos a atualização.
		fireTableRowsDeleted(indiceLinha, indiceLinha);
	}

	/* Adiciona uma lista de sócios ao final dos registros. */
	public void addListaDeContatos(List&lt;Contato&gt; contatos) {
		// Pega o tamanho antigo da tabela.
		int tamanhoAntigo = getRowCount();

		// Adiciona os registros.
		linhas.addAll(contatos);

		// Reporta a mudança. O JTable recebe a notificação
		// e se redesenha permitindo que visualizemos a atualização.
		fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);
	}

	/* Remove todos os registros. */
	public void limpar() {
		// Remove todos os elementos da lista de sócios.
		linhas.clear();

		// Reporta a mudança. O JTable recebe a notificação
		// e se redesenha permitindo que visualizemos a atualização.
		fireTableDataChanged();
	}

	/* Verifica se este table model está vazio. */
	public boolean isEmpty() {
		return linhas.isEmpty();
	}

}

Acho que com isso vc pode ter uma idéia de como ficará o seu TableModel.
Note que o model só se preocupa em como apresentar os dados.

M

Irei fazer as devidas alterações no meu modelo TableModel. Contudo gostaria de saber se posso continuar utilizando a lista da forma que criei acima na classe Agenda, que seria o " contatoDao" que vc se refere. Já de acordo com as instruções que vc me passou terei que criar 1 ou 2 metodos do tipo lista na classe Agenda. O primeiro sem passagem de parâmetro para listar todos o dados da lista e outro passando como parâmetro o nome do “cliente” cadastrado na agenda para ser listado somente seus dados na jTable?
Desta forma:

Public List<Contatos>carregarContatos() throws SQLException{  

public List<Contatos>carregarContatosPorNome(String nome) throws SQLException{
1. public List<Contatos> getList(String nome) throws SQLException{     
   2.         String sql ="SELECT registro,nome,telefone FROM registros WHERE nome LIKE ?";     
   3.         PreparedStatement stm = conn.prepareStatement(sql);     
   4.         stm.setString(1,nome);     
   5.         ResultSet rs = stm.executeQuery();     
   6.     
   7.         List<Contatos> minhaLista = new ArrayList<Contatos>();     
   8.     
   9.         while(rs.next()){     
  10.             Contatos tab = new Contatos();     
  11.             tab.setRegistro(Long.valueOf(rs.getString("registro")));     
  12.             tab.setNome(rs.getString("nome"));     
  13.             tab.setTelefone(rs.getString("telefone"));     
  14.             minhaLista.add(tab);     
  15.     
  16.                
  17.         }     
  18.         rs.close();     
  19.         stm.close();     
  20.         return minhaLista;     
  21.        
  22.     }
ViniGodoy

O ContatoDao seria a classe que pega contatos do banco e transforma na lista da classe contato. No caso, no seu sistema, quem está desempenhando esse papel é a Agenda.

Não tem problema usa-la. O que vc vai fazer, na hora de preencher na tabela, é simplesmente pegar da agenda e trocar o model do seu JTable:

List&lt;Contatos&gt; contatos = agenda.getList("M"); ContatoTableModel model = new ContatoTableModel(contatos); tblContato.setModel(model);

M

vou alterar o meu projeto de acordo com as suas instruções e depois posto os resultados. Obrigado.

S

pq nao?

ViniGodoy

Por que não o que?

Eric_Yuzo

hehe, acabei de ver um erro no meu exemplo lendo este tópico.

public void getContato(int indiceLinha) { linhas.get(indiceLinha); } O correto seria retornar o contato:

public Contato getContato(int indiceLinha) { return linhas.get(indiceLinha); }
Já corrigi no outro tópico também.

S

isso percebi tambem… esse é um erro desgraçado que so matando mesmo…

M

Antes que eu faça as devidas modificações no meu projeto conforme as instruções que recebi, gostaria de de esclarecer duas dúvidas:

1ª - O código abaixo é usado para preencher a jTable com esse novo modelo, certo. A pergunta é a seguinte, onde devo inserir esse código, na Classe Agenda onde ficam todos os métodos de acesso ao banco de dados, nas propriedades da jTable, no caso, código personalizado -pré inicialização ou dentro da classe ContatoTableModel ?

List<Contatos> contatos = agenda.getList("M");   
ContatoTableModel model = new ContatoTableModel(contatos);   
tblContato.setModel(model);

2ª - No trecho de código abaixo na parte agenda.getList(“M”), o caracter M é o parâmentro usado para trazer os resultados da pesquisa, no caso que possuem a letra M no nome ?

List<Contatos> contatos = agenda.getList("M");
M

Vini, vc ainda não me respondeu a última dúvida postada, no entanto encontrei mais um problema em relação a instrução que vc me passou. No código abaixo vc diz que deve-se pegar os contatos da agenda, só que na classe Agenda como vc já sabe eu criei a lista, só que quando eu digito Agenda., o NetBeans não encontra o método da lista criada public List<Contatos> getList() e pede para criar o método getList na classe Agenda.

view plaincopy to clipboardprint?

   1. List<Contatos> contatos = agenda.getList("M");     
   2. ContatoTableModel model = new ContatoTableModel(contatos);     
   3. tblContato.setModel(model);

Quando cria-se o método getList o NetBeans cria da seguinte forma:

private static List<Contatos>getList(){

só que eu estou utlizando o preparedStatement e da forma como o netBeans criou este método da Lista como static ele indica o seguinte erro no uso do preparedStatement:
non-variable static cannot… de que forma posso corrigir este problema ?

ViniGodoy

Sim, vc vai precisar fazer algo como

Agenda agenda = new Agenda(); List&lt;Contato&gt; contatos = agenda.getList();

E no caso anterior, o parâmetro M servia pro que vc descreveu mesmo.

M
Tudo bem, mas onde devo colocar essa parte do código, nas propriedades da jtable ou diretamente na classe Agenda:
Agenda agenda = new Agenda()
   1. List<Contatos> contatos = agenda.getList("M");     
   2. ContatoTableModel model = new ContatoTableModel(contatos);     
   3. tblContato.setModel(model);
. Fiz as alterações como criar da forma como o netBeans estava pedindo a lIsta:
public static List<Contatos> getLista (){
e coloquei esse trecho de código na propriedade da jtable( código personalizado)
1. List<Contatos> contatos = agenda.getList("%" + tfPesq.getText()+"%");    
   2. ContatoTableModel model = new ContatoTableModel(contatos);     
   3. tblContato.setModel(model);
e refiz o meu Tablemodel de acordo com exemplo que vc me passou e mesmo assim, a jtable não me mostrou o resultado com dados da pesquisa. o que ela está mostrando é somente todos os contatos já cadastrados no banco e não o que estamos pesuisando.
ViniGodoy

Poste o método getList() que vc está usando. O problema não está no JTable.

M
public static List<Contatos> getList(String nome) throws SQLException{     
        String sql ="SELECT registro,nome,telefone FROM registros WHERE nome LIKE ?";     
        PreparedStatement stm = conn.prepareStatement(sql);     
        stm.setString(1,nome);     
        ResultSet rs = stm.executeQuery();     
     
        List<Contatos> minhaLista = new ArrayList<Contatos>();     
     
        while(rs.next()){     
            Contatos tab = new Contatos();     
            tab.setRegistro(Long.valueOf(rs.getString("registro")));     
            tab.setNome(rs.getString("nome"));     
            tab.setTelefone(rs.getString("telefone"));     
            minhaLista.add(tab);     
                    
        }     
        rs.close();     
        stm.close();     
        return minhaLista;     
       
    }

No tableModel que vc passou tem um metodo que retorna só string, o problema é que no meu projeto deve vir registro que seria o código do cliente, no caso inteiro. Talvez o problema seja esse. isso que estou falando tá no modelo que vc me passou, o do Erick, abaixo. Talvez seja por isso, que a jtable não mostra o resultado da pesquisa. Mas mostra todos os dados cadastrados no banco, inclusive o registro(codigo) .

public Class<?> getColumnClass(int columnIndex) { return String.class; }

ViniGodoy

Mas vc não consegue olhar o código do TableModel, entender e corrigir?

Você pode fazer algo como:

public Class<?> getColumnClass(int columnIndex) {     
   if (coluna == COL_REGISTRO)
      return Integer.class;

   return String.class;     
}
M

Eu ainda não tenho experiência em java, estou começando agora, por isso tenho tantas dúvidas. Mas vc não respondeu se o código da Lista está correto já que pediu para que eu o postasse. Tem algum problema no código ?
E esse código abaixo devo colocar nas propriedades da jTable ?

List<Contatos> contatos = agenda.getList("%" + tfPesq.getText()+"%");      
2. ContatoTableModel model = new ContatoTableModel(contatos);       
3. tblContato.setModel(model);
ViniGodoy

Aparentemente ele está certo sim. Você quer que apareça todos os que tem “m” no nome, ou os que começam com “M”?

Se for os que começam, o critério do like deveria ser só “M%” e não “%M%”

M

Sei dessas características com o comando like, mas independente disso, a tabela continua a não listar esses resultados da pesquisa na jTable. A única coisa visualizada na jTable é todos contatos cadastrados no banco, que por sinal vem da classe

List<Contatos> contatos = agenda.getList("%" + tfPesq.getText()+"%");         
2. ContatoTableModel model = new ContatoTableModel(contatos);         
3. tblContato.setModel(model);

Parece que o parâmetro passado, ou seja, digitado no textfield não está funcionando

List<Contatos> contatos = agenda.getList("%" + tfPesq.getText()+"%");

Eu estou colocando esses códigos nas propriedades da jTable está certo ? ou tenho que colocar dentro da classe agenda ?

List<Contatos> contatos = agenda.getList("%" + tfPesq.getText()+"%");         
2. ContatoTableModel model = new ContatoTableModel(contatos);         
3. tblContato.setModel(model);
ViniGodoy

Anexa aqui o código todo da classe onde o JTable está. Seu código aparentemente está certo.

M
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Agenda.java
 *
 * Created on 04/12/2010, 09:39:34
 */

package br.com.integrator.cap11.agenda;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 *
 * @author marcelo
 */
public class Agenda extends javax.swing.JFrame {

    private TabelaAgenda tabela;
    private Statement stmt;
    private Conexao conexao;
    private Connection conn;
    private String rowId;
    private boolean novo;
    private Object tamanhoFrame;
    private ArrayList<String[]> ResultSets;
    private String value;
    private Connection con;
    List<Contatos> contato;
    
   
    
      private ResultSet getResults(){
        ResultSet rs =null;
        try{
            rs=stmt.executeQuery("select*from registros ORDER BY registro");
        }catch(SQLException e){}
        return rs;
    }

  

    
    /** Creates new form Agenda */
    public Agenda()throws SQLException {
        conexao=new Conexao();
        conn=conexao.getConexao();
        stmt=conn.createStatement();
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        Sobre = new javax.swing.JDialog();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();
        jTabbedPane1 = new javax.swing.JTabbedPane();
        panelAgenda = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        lNomepes = new javax.swing.JLabel();
        tfPesq = new javax.swing.JTextField();
        jButton2 = new javax.swing.JButton();
        panelDados = new javax.swing.JPanel();
        lNome = new javax.swing.JLabel();
        lEndereco = new javax.swing.JLabel();
        lBairro = new javax.swing.JLabel();
        lCidade = new javax.swing.JLabel();
        lEstado = new javax.swing.JLabel();
        lCep = new javax.swing.JLabel();
        lTelefone = new javax.swing.JLabel();
        tfNome = new javax.swing.JTextField();
        tfEndereco = new javax.swing.JTextField();
        tfBairro = new javax.swing.JTextField();
        tfCidade = new javax.swing.JTextField();
        javax.swing.text.MaskFormatter maskestado = null;
        try{
            maskestado = new javax.swing.text.MaskFormatter("UU");
            maskestado.setPlaceholderCharacter('_');
        }catch(java.text.ParseException exc){}
        tfEstado = new javax.swing.JFormattedTextField(maskestado);
        javax.swing.text.MaskFormatter maskcep =null;
        try{
            maskcep = new javax.swing.text.MaskFormatter("#####-###");
            maskcep.setPlaceholderCharacter('_');
        }catch(java.text.ParseException exc){}
        tfCep = new javax.swing.JFormattedTextField(maskcep);
        javax.swing.text.MaskFormatter masktel = null;
        try{
            masktel = new javax.swing.text.MaskFormatter("(##)####-####");
            masktel.setPlaceholderCharacter('_');
        }catch(java.text.ParseException exc){}
        tfTelefone = new javax.swing.JFormattedTextField(masktel);
        jToolBar1 = new javax.swing.JToolBar();
        btSalvar = new javax.swing.JButton();
        btNovo = new javax.swing.JButton();
        btExcluir = new javax.swing.JButton();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem2 = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        jMenuItem3 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        jMenuItem4 = new javax.swing.JMenuItem();

        Sobre.setTitle("Sobre a Agenda");

        jLabel1.setIcon(new javax.swing.ImageIcon("C:\\Documents and Settings\\marcelo\\Meus documentos\\icones\\Livros\\4828_128x128.png")); // NOI18N

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 18));
        jLabel2.setText("Agenda do NetBeans");

        jLabel3.setFont(new java.awt.Font("Tahoma", 0, 10));
        jLabel3.setText("Versão 1.0 - ano: 2010");

        jLabel4.setText("Autor: Marcelo Kleyton");

        jButton1.setText("Fechar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout SobreLayout = new javax.swing.GroupLayout(Sobre.getContentPane());
        Sobre.getContentPane().setLayout(SobreLayout);
        SobreLayout.setHorizontalGroup(
            SobreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, SobreLayout.createSequentialGroup()
                .addContainerGap(37, Short.MAX_VALUE)
                .addComponent(jLabel2)
                .addGap(68, 68, 68))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, SobreLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jLabel1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 16, Short.MAX_VALUE)
                .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 128, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            .addGroup(SobreLayout.createSequentialGroup()
                .addGap(120, 120, 120)
                .addComponent(jButton1)
                .addContainerGap(107, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, SobreLayout.createSequentialGroup()
                .addContainerGap(182, Short.MAX_VALUE)
                .addComponent(jLabel3)
                .addContainerGap())
        );
        SobreLayout.setVerticalGroup(
            SobreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(SobreLayout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(SobreLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel4)
                    .addComponent(jLabel1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButton1)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jLabel3))
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                formWindowClosing(evt);
            }
            public void windowOpened(java.awt.event.WindowEvent evt) {
                formWindowOpened(evt);
            }
        });

        jToolBar1.addSeparator();

        panelAgenda.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

        try{    
              Agenda agenda = new Agenda()   
             List<Contatos> contatos = agenda.getList("%"+tfPesq.getText()+"%");            
            TabelaAgenda model = new TabelaAgenda(contatos);       
            jTable1.setModel(model);   

            
        }catch(Exception ex){ex.printStackTrace();};
        jTable1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jTable1MouseClicked(evt);
            }
        });
        jScrollPane1.setViewportView(jTable1);

        lNomepes.setText("Nome");

        jButton2.setText("Pesquisar");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelAgendaLayout = new javax.swing.GroupLayout(panelAgenda);
        panelAgenda.setLayout(panelAgendaLayout);
        panelAgendaLayout.setHorizontalGroup(
            panelAgendaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelAgendaLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelAgendaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 430, Short.MAX_VALUE)
                    .addGroup(panelAgendaLayout.createSequentialGroup()
                        .addComponent(lNomepes)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfPesq, javax.swing.GroupLayout.PREFERRED_SIZE, 299, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(18, 18, 18)
                        .addComponent(jButton2)))
                .addContainerGap())
        );
        panelAgendaLayout.setVerticalGroup(
            panelAgendaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelAgendaLayout.createSequentialGroup()
                .addGap(11, 11, 11)
                .addGroup(panelAgendaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lNomepes)
                    .addComponent(tfPesq, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 186, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(24, Short.MAX_VALUE))
        );

        jTabbedPane1.addTab("Agenda", panelAgenda);

        lNome.setText("Nome");

        lEndereco.setText("Endereço");

        lBairro.setText("Bairro");

        lCidade.setText("Estado");

        lEstado.setText("Cidade");

        lCep.setText("CEP");

        lTelefone.setText("Telefone");

        javax.swing.GroupLayout panelDadosLayout = new javax.swing.GroupLayout(panelDados);
        panelDados.setLayout(panelDadosLayout);
        panelDadosLayout.setHorizontalGroup(
            panelDadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDadosLayout.createSequentialGroup()
                .addGroup(panelDadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelDadosLayout.createSequentialGroup()
                        .addGap(6, 6, 6)
                        .addGroup(panelDadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(lEndereco)
                            .addComponent(lBairro)
                            .addComponent(lCidade)))
                    .addGroup(panelDadosLayout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(lNome)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelDadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelDadosLayout.createSequentialGroup()
                        .addComponent(tfEstado, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lCep)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfCep, javax.swing.GroupLayout.PREFERRED_SIZE, 68, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lTelefone)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfTelefone))
                    .addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelDadosLayout.createSequentialGroup()
                        .addComponent(tfBairro, javax.swing.GroupLayout.PREFERRED_SIZE, 134, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(12, 12, 12)
                        .addComponent(lEstado, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tfCidade))
                    .addComponent(tfNome, javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(tfEndereco, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 338, Short.MAX_VALUE))
                .addContainerGap(59, Short.MAX_VALUE))
        );
        panelDadosLayout.setVerticalGroup(
            panelDadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelDadosLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelDadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lNome)
                    .addComponent(tfNome, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelDadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(tfEndereco, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lEndereco))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelDadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lBairro)
                    .addComponent(tfBairro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(tfCidade, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lEstado))
                .addGap(10, 10, 10)
                .addGroup(panelDadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(lCidade)
                    .addComponent(tfEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lCep)
                    .addComponent(tfCep, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(lTelefone)
                    .addComponent(tfTelefone, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(139, Short.MAX_VALUE))
        );

        jTabbedPane1.addTab("Dados", panelDados);

        jToolBar1.setRollover(true);

        btSalvar.setText("Salvar");
        btSalvar.setFocusable(false);
        btSalvar.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btSalvar.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btSalvar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btSalvarActionPerformed(evt);
            }
        });
        jToolBar1.add(btSalvar);

        btNovo.setText("Novo");
        btNovo.setFocusable(false);
        btNovo.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btNovo.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btNovo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btNovoActionPerformed(evt);
            }
        });
        jToolBar1.add(btNovo);

        btExcluir.setText("Excluir");
        btExcluir.setEnabled(false);
        btExcluir.setFocusable(false);
        btExcluir.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btExcluir.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btExcluir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btExcluirActionPerformed(evt);
            }
        });
        jToolBar1.add(btExcluir);

        jMenu1.setMnemonic('A');
        jMenu1.setText("Arquivo");

        jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem1.setText("Novo");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem1);

        jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem2.setText("Salvar");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem2ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem2);
        jMenu1.add(jSeparator1);

        jMenuItem3.setText("Sair");
        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem3ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem3);

        jMenuBar1.add(jMenu1);

        jMenu2.setMnemonic('u');
        jMenu2.setText("Ajuda");

        jMenuItem4.setText("Sobre");
        jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem4ActionPerformed(evt);
            }
        });
        jMenu2.add(jMenuItem4);

        jMenuBar1.add(jMenu2);

        setJMenuBar(jMenuBar1);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jToolBar1, javax.swing.GroupLayout.DEFAULT_SIZE, 467, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(10, 10, 10)
                        .addComponent(jTabbedPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 457, Short.MAX_VALUE)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(11, 11, 11)
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 25, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 280, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTable1MouseClicked
       btExcluir.setEnabled(true);
       rowId =(String)tabela.getValueAt(jTable1.getSelectedRow(), 0);
       if(evt.getClickCount()==2){
           jTabbedPane1.setSelectedIndex(1);
           visRegistro(rowId);
           habCampos();

       }
    }//GEN-LAST:event_jTable1MouseClicked

    private void btSalvarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btSalvarActionPerformed
        // TODO add your handling code here:
        if(novo)
            insRegistro();
        else
            atRegistro();
        desCampos();
        btExcluir.setEnabled(false);

    }//GEN-LAST:event_btSalvarActionPerformed

    private void btNovoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btNovoActionPerformed
        // TODO add your handling code here:
        novo=true;
        jTabbedPane1.setSelectedIndex(1);
        limpar();
        habCampos();
        btExcluir.setEnabled(false);

    }//GEN-LAST:event_btNovoActionPerformed

    private void btExcluirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btExcluirActionPerformed
        // TODO add your handling code here:
        try{
            excluir(rowId);
        }catch(SQLException ex){
            ex.printStackTrace();
        }


    }//GEN-LAST:event_btExcluirActionPerformed

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
        // TODO add your handling code here:
        novo=true;
        jTabbedPane1.setSelectedIndex(1);
        limpar();
        habCampos();
        btExcluir.setEnabled(false);
    }//GEN-LAST:event_jMenuItem1ActionPerformed

    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
        // TODO add your handling code here:
        if(novo)
            insRegistro();
        else
            atRegistro();
        desCampos();
        btExcluir.setEnabled(false);

    }//GEN-LAST:event_jMenuItem2ActionPerformed

    private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed
        // TODO add your handling code here:
        System.exit(0);
    }//GEN-LAST:event_jMenuItem3ActionPerformed

    private void formWindowOpened(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowOpened
        // TODO add your handling code here:
        desCampos();
    }//GEN-LAST:event_formWindowOpened

    private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
        // TODO add your handling code here:
        conexao.fechar(stmt);
        conexao.fecharConexao();
    }//GEN-LAST:event_formWindowClosing

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        // TODO add your handling code here:
        Sobre.dispose();
    }//GEN-LAST:event_jButton1ActionPerformed

    private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem4ActionPerformed
        // TODO add your handling code here:
        java.awt.Dimension tamanhoDialogo=Sobre.getPreferredSize();
        java.awt.Dimension tamanhoFrame=getSize();
        java.awt.Point loc=getLocation();
        Sobre.setLocation((tamanhoFrame.width - tamanhoDialogo.width)/2 + loc.x,(tamanhoFrame.height - tamanhoDialogo.height)/2 +loc.y);
        Sobre.setModal(true);
        Sobre.pack();
        Sobre.setVisible(true);
    }//GEN-LAST:event_jMenuItem4ActionPerformed

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        try {
            listarContatos();
        } catch (SQLException ex) {
            Logger.getLogger(Agenda.class.getName()).log(Level.SEVERE, null, ex);
        }

    }//GEN-LAST:event_jButton2ActionPerformed

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    new Agenda().setVisible(true);
                } catch (SQLException ex) {
                    Logger.getLogger(Agenda.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JDialog Sobre;
    private javax.swing.JButton btExcluir;
    private javax.swing.JButton btNovo;
    private javax.swing.JButton btSalvar;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JLabel lBairro;
    private javax.swing.JLabel lCep;
    private javax.swing.JLabel lCidade;
    private javax.swing.JLabel lEndereco;
    private javax.swing.JLabel lEstado;
    private javax.swing.JLabel lNome;
    private javax.swing.JLabel lNomepes;
    private javax.swing.JLabel lTelefone;
    private javax.swing.JPanel panelAgenda;
    private javax.swing.JPanel panelDados;
    private javax.swing.JTextField tfBairro;
    private javax.swing.JTextField tfCep;
    private javax.swing.JTextField tfCidade;
    private javax.swing.JTextField tfEndereco;
    private javax.swing.JTextField tfEstado;
    private javax.swing.JTextField tfNome;
    private javax.swing.JTextField tfPesq;
    private javax.swing.JTextField tfTelefone;
    // End of variables declaration//GEN-END:variables

    private void visRegistro(String value) {
       JTextField[] tf =campos();
       String SQL = "SELECT*FROM registros WHERE registro ="+ value;
       ResultSet res;
       try{
           res = stmt.executeQuery(SQL);
           res.next();
           for(int i=0;i<tf.length;i++)
               tf[i].setText(res.getString(i+2));
       }catch(SQLException ex){
           ex.printStackTrace();
       }
    }



    private void habCampos() {
       JTextField[]tf = campos();
         for(int i=0;i<tf.length;i++)
            tf[i].setEnabled(true);
    }

    private JTextField[] campos(){
        JTextField[]tf ={tfNome,tfEndereco,tfBairro,tfCidade,tfEstado,tfCep,tfTelefone};
        return tf;

    }



    private void desCampos(){
        JTextField[] tf=campos();
            for(int i=0;i<tf.length;i++)
                tf[i].setEnabled(false);
        }

     private void delRegistro(String value)throws SQLException{
         String SQL="DELETE FROM registros  WHERE registro="+value;
         stmt.executeUpdate( SQL);
     }

     private void excluir(String valor)throws SQLException{
         int opcao=JOptionPane.showConfirmDialog(this,"Tem certeza  que você deseja excluir esse cadastro?","Exclusão do Cadastro",JOptionPane.YES_NO_OPTION);
         if(opcao == JOptionPane.YES_OPTION){
             delRegistro(valor);
             tabela.deletRow(jTable1.getSelectedRow());
             btExcluir.setEnabled(false);
         }
     }
     
     private void insRegistro(){
         JTextField []tf = campos();
         try{
             String SQL="INSERT INTO registros" +"(nome,endereco,bairro,cidade,estado,cep,telefone)"+ "VALUES (?,?,?,?,?,?,? )";
             PreparedStatement ps = conn.prepareStatement(SQL);
             for(int i=0;i<tf.length;i++)
                 ps.setString(i+1,tf[i].getText());
                 ps.executeUpdate();
                 limpar();
                 tabela.setResult(getResults());
                 ps.close();
                 jTabbedPane1.setSelectedIndex(0);
                 novo=false;
         }catch(SQLException ex){ex.printStackTrace();}
     }

      private void atRegistro(){
          JTextField[] tf = campos();
          int opcao=JOptionPane.showConfirmDialog(this,"Deseja salvar as alterções feitas nesse cadastro ?","Alteração de Cadastro",JOptionPane.YES_NO_OPTION);
          if(opcao == JOptionPane.YES_OPTION){
              try{
                  String SQL ="UPDATE registros SET" + " nome=?, endereco=?, bairro=?, cidade=?," + "estado=?, cep=?, telefone=?" + "WHERE registro=?";
                  PreparedStatement ps = conn.prepareStatement(SQL);
                  for(int i=0;i<tf.length;i++)
                      ps.setString(i+1, tf[i].getText());
                      ps.setString(8, rowId);
                      ps.executeUpdate();
                      limpar();
                      tabela.setResult(getResults());
                      ps.close();
                      jTabbedPane1.setSelectedIndex(0);
                      novo=false;
              }catch(SQLException ex){ex.printStackTrace();}
          }
      }
    private void limpar() {
        JTextField[]tf = campos();
        for(int i=0;i<tf.length;i++)
            tf[i].setText("");
    }

    public List<Contatos> getLista(String nome) throws SQLException{
        String sql ="SELECT registro,nome,telefone FROM registros WHERE nome LIKE ?";
        PreparedStatement stm = conn.prepareStatement(sql);
        stm.setString(1,nome);
        ResultSet rs = stm.executeQuery();

        List<Contatos> minhaLista = new ArrayList<Contatos>();

        while(rs.next()){
            Contatos tab = new Contatos();
            tab.setRegistro(Long.valueOf(rs.getString("registro")));
            tab.setNome(rs.getString("nome"));
            tab.setTelefone(rs.getString("telefone"));
            minhaLista.add(tab);

          
        }
        rs.close();
        stm.close();
        return minhaLista;
   
    }


    

  }
        
}

No evento do botão pesquisar estou chamando o método getLista() da lista de contatos{

getLista("%"+tfPesq.getText()+"%"); mas quando digito algo no jtextField não lista nada na jTable. Os getResults usados em outros métodos como atualizar não estão sendo mais usados.

ViniGodoy

Ué, cadê a implementação do método listarContatos()?

Outra coisa, aquele código do setModel deveria estar no seu botão pesquisar, não na inicialização do frame. Na inicialização do Frame ele vai listar todos da tabela, pois o JTextField ainda estará vazio. Aí vai acabar fazendo um where com nome LIKE ‘%%’

M

Então esse código abaixo eu devo tirar das propriedades da tabela e colocar no evento do botão pesquisar e chamar o método listarContatos(), é isso ?

Agenda agenda = new Agenda()  
List<Contatos> contatos = agenda.getList("%"+tfPesq.getText()+"%");       
TabelaAgenda model = new TabelaAgenda(contatos);       
 jTable1.setModel(model);

Veja o código do método listarContatos:

private void listarContatos() throws SQLException {  
       Agenda agend =new Agenda();  
         contato=agend.getList("%"+tfPesq.getText() + "%");  
      mostrarPesquisa(contato);    
   }  
  
  private void mostrarPesquisa(List<Contatos> contato) throws SQLException {  
        if(contato.size() == 0){  
         JOptionPane.showMessageDialog(null, "Dado não encontrado na pesquisa");  
       }else{             
    String [] linha = new String[]{null,null,null};  
           for(int i=0;i< contato.size();i++){  
  
         // tabela.addTableModelListener(jTable1);  
            tabela.setValueAt(contato.get(i).getRegistro(),i, 0);  
            tabela.setValueAt(contato.get(i).getNome(),i, 1);  
            tabela.setValueAt(contato.get(i).getTelefone(),i, 2);  
       }  
             tabela.fireTableDataChanged();  
     }     
  }

Essa parte final do código mostrarpesquisa fiz com base no dafaultTableModel e eu não sei como corrigir, pois da forma como está não mostra nada na jtable. a variável tabela recebe os valores mas é como se os recebesse, pois não os permite visualizar.

ViniGodoy

Isso aqui será seu código listaContatos():

public void listaContatos() {
   List&lt;Contatos&gt; contatos = getList("%"+tfPesq.getText()+"%");       
   TabelaAgenda model = new TabelaAgenda(contatos);       
   jTable1.setModel(model); 
}

Não existirá o método mostrarPesquisa().
Quando vc fizer o setModel, a tabela se atualizará automaticamente.

M

Desculpe pela falta de notícias, pois estava sem internet. Em relação as instruções que vc me passou, fiz os testes e o módulo para pesquisa passou a funcionar corretamente, ou seja, da forma como deveria. Muito obrigado.
Antes que seja encerrado esse tópico, tenho algumas dúvidas e gostaria que vc me explicasse:

No projeto do Erick, o TableModel tem o seguinte código:

private static final long SerialVersionUID = 1L;, seria um número de serial para especificar o programa ou seria um valor inteiro, como código do cliente para ser usado na aplicação ?

E outra, qual a necessidade de criar um ContatoTableModel vazio, já que existe um ContatoTableModel preenchido.

/* Cria um ContatoTableModel vazio. */

public ContatoTableModel() {   
        linhas = new ArrayList<Contato>();   
    }
ViniGodoy

Geralmente adiciona-se o construtor vazio para o caso de você querer criar uma tabela de contato sem ninguém. Poderia ser numa tela “Selecionar contato”, por exemplo, que viesse vazia, e os contatos só seriam selecionados após uma busca.

O SerialVersionUID é um campo long, que indica qual é a identificação da classe sendo serializada. Estude sobre serialização. Você vai ver que sempre atribuir 1L para o campo também é incorreto.

M

Depois que troquei o meu TableModel o sistema não consegue mais excluir dados da jtable, assim como, atualizar. Acho que não está retornando o código(registro). Funcionava assim: Na Jtable, aparecia os contatos como está ocorrendo agora. Depois para excluir bastava selecionar um dos contatos da jtable e mandar excluir e pronto, mais ele não consegue excluir. Já para atualizar, na tabela se dava duplo clique em um dos contatos e ele abria em outra paleta do jTabettpane com todos os dados do contato. Para mim o probelma é o mesmo, já que ambos os métodos precisam do código para tanto excluir quanto atualizar. Contudo minha jtable está mostrando as seguintes colunas: registro (código do cliente, nome e telefone) com todos os dados.
Esse método é para mostrar os registros nos jtextfields para serem atualizados:

1.	private void visRegistro(String value) {   
2.	       JTextField[] tf =campos();   
3.	       String SQL = "SELECT*FROM registros WHERE registro ="+ value;   
4.	       ResultSet res;   
5.	       try{   
6.	           res = stmt.executeQuery(SQL);   
7.	           res.next();   
8.	           for(int i=0;i<tf.length;i++)   
9.	               tf[i].setText(res.getString(i+2));   
10.	       }catch(SQLException ex){   
11.	           ex.printStackTrace();   
12.	       }   
13.	    }

Esse metodo que é executado no evento do mouse

1.	private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jTable1MouseClicked   
2.	       btExcluir.setEnabled(true);   
3.	       rowId =(String)tabela.getValueAt(jTable1.getSelectedRow(), 0);   
4.	       if(evt.getClickCount()==2){   
5.	           jTabbedPane1.setSelectedIndex(1);   
6.	           visRegistro(rowId);   
7.	           habCampos();

A variável rowId está declarada como variavel global do tipo String, mas é como se ela não recebesse o valor do indice do contato. Além disso, quando coloco na instrução abaixo, 1 no lugar do zero, ele não segue para a paleta de dados do tabbetPane.

Já que no metodo getValueAt do TableModel a coluna que representa o registro(código do cliente) é o zero. Assim:

1.	public Object getValueAt(int rowIndex, int columnIndex) {   
2.	        // Pega o sócio da linha especificada.   
3.	        Contato contato = linhas.get(rowIndex);   
4.	  
5.	        // Retorna o campo referente a coluna especificada.   
6.	        // Aqui é feito um switch para verificar qual é a coluna   
7.	        // e retornar o campo adequado. As colunas são as mesmas   
8.	        // que foram especificadas no array "colunas".   
9.	        switch (columnIndex) {   
10.	        case 0: // Primeira coluna é o nome.   
11.	            return contato.getRegistro();   
12.	        case 1: // Segunda coluna é o e-mail.   
13.	            return contato.getNome();   
14.	        case 2: // Terceira coluna é o telefone fixo.   
15.	            return contato.getTelefone();   
16.	        case 3: // Quarta coluna é o telefone celular.   
17.	            return contato.getTelefoneCelular();   
18.	        default:   
19.	            // Se o índice da coluna não for válido, lança um   
20.	            // IndexOutOfBoundsException (Exceção de índice fora dos limites).   
21.	            // Não foi necessário verificar se o índice da linha é inválido,   
22.	            // pois o próprio ArrayList lança a exceção caso seja inválido.   
23.	            throw new IndexOutOfBoundsException("columnIndex out of bounds");   
24.	        }   
25.	    }
Criado 17 de dezembro de 2010
Ultima resposta 2 de fev. de 2011
Respostas 32
Participantes 4