[Dúvida] Como fazer uma pesquisa de clientes ?

A situação do título é bem hipotética e a solução pode ser usada pra pesquisar qualquer tipo de informação cadastrada no banco de dados.
Então pessoal… Estou iniciando estudos em JAVA e procuro compreender como funciona a lógica dessa linguagem estudando na prática e quebrando a cabeça com os erros.
Talvez o método seja errado, mas imploro ajuda de vocês…
Criei um projeto onde se pode cadastrar Clientes (bem clichê) que se comunica com o MySQL e insere os dados direto no banco. Estou agora criando uma nova parte do projeto onde consigo listar os clientes já inseridos no banco e tentando criar um método de pesquisa por nome.
Através de uma JTextField e um JButton para acionar a pesquisa.
Parte do código onde atualizo os cadastros:

private void AtualizaTable() {

    Connection con = Conexao.AbrirConexao(); // Usado aqui para abrir conexão
    ClienteDAO bd = new ClienteDAO(con);
    List<Cliente> lista = new ArrayList<>();
    lista = bd.ListarCliente();
    DefaultTableModel tbm =
            (DefaultTableModel) jTable1.getModel();
    while (tbm.getRowCount() > 0){
        tbm.removeRow(0);
    }
    int i = 0;
    for (Cliente tab : lista){
        tbm.addRow(new String[i]);
        jTable1.setValueAt(tab.getCodigo(), i, 0);
        jTable1.setValueAt(tab.getNome(), i, 1);
        jTable1.setValueAt(tab.getRG(), i, 2);
        jTable1.setValueAt(tab.getCPF(), i, 3);
        jTable1.setValueAt(tab.getTelefone(), i, 4);
        jTable1.setValueAt(tab.getEmail(), i, 5);
        i++;
    }

}

Já em DAO.ClienteDAO.java

public List ListarCliente() {
String sql = “select idcliente,nome,rg,cpf,telefone,email from cliente”;
List lista = new ArrayList<>();
try {
PreparedStatement ps = getCon().prepareStatement(sql);
ResultSet rs = ps.executeQuery();

        if (rs != null) {
            while (rs.next()) {
                Cliente a = new Cliente();
                a.setCodigo(rs.getInt(1));
                a.setNome(rs.getString(2));
                a.setRG(rs.getString(3));
                a.setCPF(rs.getString(4));
                a.setTelefone(rs.getString(5));
                a.setEmail(rs.getString(6));
                
                lista.add(a);
            }
            return lista;
        } else {
            return lista;
        }
        
    } catch (SQLException e) {
        return null;
    }

}

Pois bem… esse é o método de atualizar e listar os clientes… Como faço um método para pesquisar por nome que consiga capturar o texto de uma JTextField e ser acionado por um botão ou um key pressed?
E o que devo adicionar na classe DAO.ClienteDAO.java ?

Olá

Vc não disse se o código está funcionando, pois para mim ele não deveria funcionar, então estou supondo que esteja tudo certo.

Onde está as linhas:

// List<Cliente> lista = new ArrayList<>();
lista = bd.ListarCliente();

mova a primeira linha para ser um atributo da classe.

Depois crie um método filtrarPorNome(String nome)

void filtrarPorNome(String nome) {
    // cria nova lista
    List<Cliente> clientesFiltrados = new ArrayList<>();
    // se o valor do textfield está vazia
    if (nome.isEmpty()) {
        // adiciona todos os elementos daquela lista que sugeri para transformar em atributo
        clientesFiltrados.addAll(lista);
    } else {
        for (int i = 0; i < lista.size(); i++) {
            Cliente c = lista.get(i);
            // se nome do cliente começa com o valor do textfield
            if (c.getNome().startsWith(name)) {
                clientesFiltrados.add(c);
            }
        }
    }
    atualizarTabela(clientesFiltrados);
}

No método atualizarTabela, é parecido com aquilo que vc fez no AtualizaTable, vai remover todas as linhas e adicionar tudo novamente.

Por ultimo, adicionar o listener no botão ou textfield para chamar o filtrarPorNome

Não precisa mudar a classe DAO, a vantagem de fazer desse jeito é de não sobrecarregar o banco, mas se vc quiser a pesquisa pelo banco, fica parecido com ListarCliente que vc fez, só muda o sql

List ListarClientePorNome(String nome) {
    String sql = "select idcliente,nome,rg,cpf,telefone,email from cliente where nome='" + nome +"'";

A vantagem desta é que sempre será atualizada quando requisitada.

Olá Diego ! Agradeço pela ajuda.
Sim, o código até o momento está funcionando direitinho.
O que não manjei ainda foi como atribuir ao botão essa função de pesquisar no banco se algum cliente tem em seu nome o fragmento digitado no textfield.

Para atribuir a função ao botão:

JButton button;
JTextField textField;
JTable table;

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        String texto = textField.getText(); // obtem o texto do textfield
        List list = pesquisarPorNome(texto); // faz a pesquisa
        atualizarTabela(table, list); // atualiza tabela
    }
});

https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html

Para pesquisar por fragmento, vc teria que montar uma String SQL, semelhante ao que está no link abaixo: