Caixa de busca

Olá!
Estou querendo fazer uma caixa de busca, onde o usuário digita um nome e o sistema busca em tempo real, aquele nome digitado. Os nomes estão aparecendo em uma JTable, busco em um JTextField. Java para desktop, estou usando a IDE Eclipse

Uma maneira seria adicionar KeyListener ao JTextField.
Ex:

jTextField.addKeyListener(new KeyAdapter() { @Override public void keyReleased(KeyEvent e){ //chama seu método para buscar no bd e atualizar JTable conforme o que está escrito no jTextField } }

opa

cara tenho um aqui que fiz esses dias, funciona mas tem oque melhorar. Não tive tempo ainda,
ele busca em uma arrayList e a medida que você vai digitando as letras ele vai refinando a pesquisa.

private void campoBuscaKeyReleased(java.awt.event.KeyEvent evt) {                                       
    if (evt.getKeyCode() != KeyEvent.VK_ENTER) {
        int quantCar = campoBusca.getText().length();//pega quantas letras foram digitadas
        val.setRowCount(0);//zera a tabela para popular com novo resultado refinado
        listaHistoricos.stream().forEach((listaHistorico) -> {
            String pesquisa = campoBusca.getText();
            String lista = "";
            listaHistorico.getNomeHistorico().length();
            if (listaHistorico.getNomeHistorico().length() >= quantCar) {//verifica se a frase digitada não é maior que a frase a ser pesquisada
                lista = listaHistorico.getNomeHistorico().substring(0, quantCar);
            }
            if (pesquisa.equalsIgnoreCase(lista)) {
                val.addRow(new String[]{Integer.toString(listaHistorico.getCod()), listaHistorico.getTipo(), listaHistorico.getNomeHistorico()});
            }
        });
    }
}

Fiz o meu próprio código, na base do chute mesmo auheuahe
De toda forma, funcionou…

if(e.getSource() == btBusca) {
			Connection conn = null;
			model.setRowCount(0);
			try {
				Class.forName(driver);
				conn = DriverManager.getConnection(url,user,password);
				Statement stm = conn.createStatement();
				
				ResultSet rId = stm.executeQuery("SELECT A001_ID FROM A001");
				ResultSet rNome = stm.executeQuery("SELECT A001_NOME FROM A001");
				ResultSet rTelCelular = stm.executeQuery("SELECT A001_TELCELULAR FROM A001");
				ResultSet rEmail = stm.executeQuery("SELECT A001_EMAIL FROM A001");
				ResultSet rBirth = stm.executeQuery("SELECT A001_NASCIMENTO FROM A001");
				
				while(rId.next() && rNome.next() && rTelCelular.next() && rBirth.next() && rEmail.next()) {
					if(rNome.getString("A001_NOME").contains(tBusca.getText())) {
						model.addRow(new Object[]{rId.getString("A001_ID"),rNome.getString("A001_NOME"),rTelCelular.getString("A001_TELCELULAR"),
								rBirth.getString("A001_NASCIMENTO"),rEmail.getString("A001_EMAIL")});
						
					}
					
				}
				
				stm.execute("shutdown");
				
			} catch(SQLException ex) {
				JOptionPane.showMessageDialog(null, "Erro SQL\n"+ex.getMessage(),"Erro 0x1",0);
				
			} catch(ClassNotFoundException ex) {
				JOptionPane.showMessageDialog(null, "Erro ClassNotFound\n"+ex.getMessage(),"Erro 0x2",0);
				
			}

Resumindo… Onde eu digitava o texto era no meu tBusca, que é um JTextField. Na parte onde eu deveria filtrar, eu buscava no banco o nome e verificava se tinha o que eu havia digitado.

Exemplo:
Eu digitei "CHA"
Ele verificava no if, se algum nome do banco tinha o “CHA” que digitei. No caso, tinha meu nome, CHAYBE. Então aparecia apenas esse. Ao apagar, ele retornava à tabela normal, por algum motivo louco, que ainda não consegui entender kk Mas caiu como uma luva kk

Para buscar no banco, usei comando SQL simples SELECT, armazenei no ResultSet, fiz um laço pra ir buscando dados e dentro dele um if com o método contains() para verificar se tinha o que digitei. E foi assim que a mágica foi feita.

Porém, ocorreu algo triste.
Minha busca ficou EXTREMAMENTE lenta. Chega a demorar mais de 5 segundos para buscar entre dez nomes. Faz sentido, já que tem que buscar em todas as palavras, etc… Mas não teria um meio mais rápido disso acontecer?