Método para Limpar Campos não está funcionado Corretamente

Bom dia,

Vamos aos detalhes … Quando a aplicação abre, carrega a consulta ao BD em uma tabela através do método buscaRegistroClientes(); conforme código abaixo.

    private void buscaRegistroClientes() {
        ClienteControl cli = new ClienteControl();
        List<ClienteBean> clientes;
        clientes = cli.listarClientes("%" + tfPesquisaCliente.getText().trim() + "%");
        mostrarClientes(clientes);
    }

    // Mostra os Registros de Clientes na Tabela
    private void mostrarClientes(List<ClienteBean> clientes) {
        tbCliente.getColumnModel().getColumn(0).setPreferredWidth(150);
        tbCliente.getColumnModel().getColumn(1).setPreferredWidth(50);
        tbCliente.getColumnModel().getColumn(2).setPreferredWidth(50);
        tbCliente.getColumnModel().getColumn(3).setPreferredWidth(50);
        
        while (tmClientes.getRowCount() > 0) {
            tmClientes.removeRow(0);
        }

        if (clientes.size() == 0) {
            //JOptionPane.showMessageDialog(this, "Nenhum Cliente Encontrado!");
        } else {
        }
        String[] campos = new String[]{null, null, null, null};
        for (int i = 0; i < clientes.size(); i++) {

            tmClientes.addRow(campos);
            tmClientes.setValueAt(clientes.get(i).getNome(), i, 0);
            tmClientes.setValueAt(clientes.get(i).getTelefone(), i, 1);
            tmClientes.setValueAt(clientes.get(i).getCelular(), i, 2);
            tmClientes.setValueAt(clientes.get(i).getEmail(), i, 3);
        }
    }

Antes de preencher a tabela são criados 2 objetos, um ListSelectionModel e um DefaultTableModel conforme códigos abaixo.

    ListSelectionModel lsmClinetes;
    
    DefaultTableModel tmClientes = new DefaultTableModel(null, new String[]{"Nome", "Telefone", "Celular", "Aniversário"}) {

        public boolean isCellEditable(int row, int col) {
            return false;
        }
    };

Depois eu aplico o ListSelectionModel à tabela Clientes b[/b] conforme código a seguir.

tbCliente.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
lsmClinetes = tbCliente.getSelectionModel();
lsmClinetes.addListSelectionListener(new ListSelectionListener() {
        public void valueChanged(ListSelectionEvent e){
        if(!e.getValueIsAdjusting()){
        tbClienteLinhaSelecionada(tbCliente);
}
}
});

Quando o usuário quer visualizar as informações completas do cliente nos campos abaixo da tabela, é só selecionar a linha contendo o cliente desejado e pronto. O código que utilizo para tal funcionalidade é o seguinte.

    // Carrega os Dados do Cliente Selecionado na Tabela nos Respectivos Campos
    private void tbClienteLinhaSelecionada(JTable tb) {
        if (tb.getSelectedRow() != -1) {
            tfCodigo_cliente.setText("" + clientes.get(tb.getSelectedRow()).getCodigo());
            tfNome_cliente.setText(clientes.get(tb.getSelectedRow()).getNome());
            tfTelefone_cliente.setText(clientes.get(tb.getSelectedRow()).getTelefone());
            tfCelular_cliente.setText(clientes.get(tb.getSelectedRow()).getCelular());
            tfEmail_cliente.setText(clientes.get(tb.getSelectedRow()).getEmail());
            tfEndereco_cliente.setText(clientes.get(tb.getSelectedRow()).getEndereco());
            tfBairro_cliente.setText(clientes.get(tb.getSelectedRow()).getBairro());
            tfDataCadastro_cliente.setText(clientes.get(tb.getSelectedRow()).getDataCadastro());

            if (clientes.get(tb.getSelectedRow()).getSexo().equals("M")) {
                rbMasculino_cliente.setSelected(true);
            } else {
                rbFeminino_cliente.setSelected(true);
            }

        }
    }

Até aí tudo funciona beleza! Meu problema começa quando o usuário possui alguns registros na tabela, seleciona alguns para visualizar as informações complementares e quando quer inserir um novo cliente, conforme código abaixo …

    private void btNovo_clienteActionPerformed(java.awt.event.ActionEvent evt) {                                               
        tipoRegistro = "novo";
        limparCamposClientes();
        habilitarCamposClientes();
        tfNome_cliente.requestFocus();
        btNovo_cliente.setEnabled(false);
        btGravar_cliente.setEnabled(true);
        btAlterar_cliente.setEnabled(false);
        btExcluir_cliente.setEnabled(false);
        btCancelar_cliente.setEnabled(true);
        tfDataCadastro_cliente.setText(df.format(data)); // Obtém uma String da Data Atual
    }

    private void limparCamposClientes() {
        tfCodigo_cliente.setText("");
        tfNome_cliente.setText("");
        tfTelefone_cliente.setText("");
        tfCelular_cliente.setText("");
        tfEmail_cliente.setText("");
        tfEndereco_cliente.setText("");
        tfBairro_cliente.setText("");
        tfPesquisaCliente.setText("");
        tfDataCadastro_cliente.setText("");
        while (tmClientes.getRowCount() > 0) {
            tmClientes.removeRow(0);
        }
    }

… os campos não estão sendo limpos, como era para ocorrer. Mas se não tiver nenhuma linha selecionada, como os campos já estão limpos, não ocorre esse problema. Gostaria de saber se existe alguma forma de reverter ou contornar esse “BUG” ou se existe alguma forma de “desselecionar” a linha da tabela clicando fora dela, para assim apagar as informações dos campos.

Obrigado a todos que puderam ajudar