Filtro JTable

Alguém sabe onde eu consigo algum material que ensina a filtrar dados em uma JTable?
Eu preciso que ao digitar uma letra em um JTextField os dados da JTable vão sendo filtrados igual se faz no Delphi.
Eu possuo o código abaixo que consegui na internet mas só que ele não funciona. Se alguém puder dar uma olhada nele pra mim ficarei muito agradecido.


import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import java.lang.String; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTable; 
import javax.swing.JTextField; 


/** 
* Esta classe herda de JFrame e contém uma tabela editável. Esta tabela 
* é criada com dados na memória, mas que poderiam ser obtidos de outra 
* forma. 
* A tabela está na forma mais simples possível, não permitindo a inserção 
* de novas linhas. Para isso, devemos considerar o uso de uma instância de 
* TableModel. 
* Dica 1: Os dados das células devem ser instâncias de classes, declaradas 
* como arrays de arrays de Objects. Para usar tipos nativos, devemos 
* usar as classes-envelope (exemplo: Integer para int, Double para 
* double, etc.) 
* Dica 2: Se sabemos o tamanho do array, isto é, quantas colunas e quantas 
* linhas ou registros, podemos começar com um array de array de 
* Objects vazio e preenchê-lo aos poucos com os dados, usando o 
* método setValueAt da classe JTable. Este método recebe como 
* argumentos o objeto que usaremos como entrada, a linha e a coluna 
* que queremos modificar. 
*/ 
public class ExemploTable extends JFrame implements ActionListener 
{ 
// Títulos das colunas. 
private Object[] títulosDasCélulas = {"Nome","Profissão","Cidade","Idade"}; 
// Cinco linhas para a tabela. 
private Object[][] dadosDasCélulas = 
{ 
{"J.S.Bell","Físico","Santa Fé",new Integer(56)}, 
{"Sid Sackson","Filósofo","New York",new Integer(72)}, 
{"Scott Adams","Desenhista","Los Angeles",new Integer(4}, 
{"Dave Barry","Humorista","Miami",new Integer(53)}, 
{"David Brackeen","Programador","Los Angeles",new Integer(36)}, 
}; 
// A instância da classe que mostrará estes dados como uma tabela. 
private JTable tabela; 
// Um botão para mostrar como acesso aos dados é feito. 
private JButton exportaTabela; 

private JTextField texto; 

// O construtor, que monta a interface com o usuário. 
public ExemploTable() 
{ 
// O título da janela. 
super("Exemplo de JTable"); 

// Criamos a tabela com os dados e títulos de células existentes. 
tabela = new JTable(dadosDasCélulas,títulosDasCélulas); 

// Adicionamos a tabela ao painel de conteúdo da interface gráfica. 
getContentPane().add(new JScrollPane(tabela),BorderLayout.CENTER); 

// Ajustamos o tamanho da tabela. 
tabela.setPreferredScrollableViewportSize(new Dimension(500, 100)); 

// Criamos um botão e o registramos como respondendo a eventos. 
exportaTabela = new JButton("Exporta tabela"); 
exportaTabela.addActionListener(this); 

// Adicionamos o botão ao painel de conteúdo da interface gráfica. 
getContentPane().add(exportaTabela,BorderLayout.SOUTH); 

texto = new JTextField(""); 
getContentPane().add(texto,BorderLayout.NORTH); 


// Declaramos que a aplicação terminará ao fecharmos a janela, definimos 
// o tamanho da janela automaticamente e mostramos a janela da interface 
// gráfica no computador. 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
pack(); 
setVisible(true); 
} 

// Este método será chamado quando houver um evento de ação, ou seja, quando 
// o botão for pressionado. 
public void actionPerformed(ActionEvent e) 
{ 
// Este if é redundante, mas vamos deixá-lo assim mesmo... 
if (e.getSource() == exportaTabela) 
{ 
// Para cada linha na tabela... 
for(int linha=0;linha<tabela.getRowCount();linha++) 
{ 
// ..e para cada coluna... 
for(int coluna=0;coluna<tabela.getColumnCount();coluna++) 
{ 
// Imprimimos os valores das células. 
System.out.print(tabela.getValueAt(linha,coluna)+";"); 
} 
System.out.println(); 
} 
} 
} 

private void textoKeyReleased(java.awt.event.KeyEvent evt) { 
procuraTable(texto.getText()); 
} 

private void procuraTable(String nome){ 
int tamanho = nome.length(); 

for (int linha = 0; linha><tabela.getRowCount(); linha++){ 
String nomeTabela = (String)tabela.getValueAt(linha, 1); 
if (tabela.substring(0,tamanho).equals(nome)){ 
tabela.setRowSelectionInterval(linha,linha); 
} 
} 
} 




// O ponto de entrada da aplicação, simplesmente cria uma instância da 
// classe. 
public static void main(String[] args) 
{ 
new ExemploTable(); 
} 

}